Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

CodeBlocks Portable mit MinGW 32 und 64 Bit unter Windows

Anleitung Entwicklung C und C++

Mitglied: rubberman

rubberman (Level 2) - Jetzt verbinden

28.02.2013, aktualisiert 11.03.2016, 12279 Aufrufe, 17 Kommentare, 9 Danke

Entwicklungsumgebung und C/C++ Compiler für 32 und 64 Bit Windowssysteme.
Portable (natürlich ebenso lokal auf Festplatte) nutzbar durch ein VBScript, das als Launcher fungiert und Code::Blocks mit den nötigen Einstellungen startet.



1. Vorwort

Hallo Community.

Seit ca. 2 Jahren beschäftige ich mich nebenbei ab und zu mit C und C++. Schon damals war ich auf der Suche nach einer portablen IDE. Neben dem VC++ bin ich mit Code::Blocks als IDE einigermaßen glücklich. Während man den VC++ wohl nicht dazu überreden kann auch portable zu funktionieren, geht das bei Code::Blocks mit wenigen Tricks. Es gibt auch bereits Portable Versionen, die mich aber nicht überzeugt haben. Aus diesem Grund habe ich damit begonnen eine eigene Umsetzung zu entwickeln. Ein VBScript schien mir der Weg des geringsten Widerstands, da leicht editierbar und mit dem benötigten XML Support.
Nachdem Windows x64 nun auch bei mir angekommen ist, habe ich das ganze noch einmal etwas überarbeitet und dachte mir, dass es vielleicht auch für euch von Interesse sein könnte.

Grüße
rubberman

2. Voraussetzungen

2.1. Systemvoraussetzungen

  • Windows Betriebssystem (bislang getestet unter XP x86, sowie Win7 x86, Win7 x64 und Win10 x64)
  • > 1,2 GB Speicherplatz (Stand Februar 2016)

2.2. 7-Zip

Die Compiler kommen in *.7z Dateien verpackt. Wer keinen passenden Unzipper zur Verfügung hat, sollte vorab 7-Zip installieren.

3. Vorbereitung

Natürlich benötigt man eine entsprechende Verzeichnisstruktur, damit das Ganze auch funktioniert. Weil Compiler über die Kommandozeile angesteuert werden, ist es sicherer wenn keines der Verzeichnisse und Unterverzeichnisse Leerzeichen oder Sonderzeichen, wie & oder % enthält.
  • Zunächst also ein neues Verzeichnis anlegen, sinnvollerweise "CodeBlocksPortable" benennen. (Dort erstellen, wo du uneingeschränkte Schreibrechte auf die Verzeichnisstruktur hast!)
  • In dieses Verzeichnis ein Unterverzeichnis "CodeBlocks", das die IDE beinhalten soll,
  • ein Unterverzeichnis "Projects", das später die Projekte beinhaltet,
  • sowie eine weiteres Unterverzeichnis "Additional_Include". Dort können selbst erstellte Header Dateien abgelegt werden, die immer wieder verwendet werden, oder auch bspw. die gern verwendeten "Boost" Header.

(Anmerkung: Wird im "Projects" Verzeichnis ein Unterverzeichnis "_archive_" erstellt, in das abgeschlossen Projekte verschoben werden können, so bleiben diese Projekte für die Anzeige in "Recent projects" des Code::Blocks Startfensters ausgeschlossen. Das kann die Verarbeitungszeit des Startscripts enorm verkürzen.)

Die Struktur sollte nun also so aussehen:
CodeBlocksPortable 
    ├─ Additional_Include 
    ├─ CodeBlocks 
    └─ Projects
Du kannst diesen Verzeichnissen auch andere Namen geben, schließlich musst du damit arbeiten können.

4. Installationen

4.1. Code::Blocks (IDE)

Die codeblocks-NN.MM-nosetup.zip hier (www.codeblocks.org/downloads/binaries) downloaden. NN.MM steht dabei für die aktuelle Version. (Aktuell codeblocks-16.01-nosetup.zip)
WICHTIG: Nicht das mingw enthaltende Archiv herunterladen! Dort käme eine GCC Version mit, die unvollständige Windows Header beinhaltet.

Den Inhalt des ZIP Archivs in das "CodeBlocks" Unterverzeichnis entpacken.

Im CodeBlocks Unterverzeichnis sollten sich nun unter anderem das "share" Verzeichnis und die "codeblocks.exe" finden:
CodeBlocksPortable 
    ├─ Additional_Include 
    ├─ CodeBlocks 
    │      ├─ share 
    │      └─ (codeblocks.exe) 
    │ 
    └─ Projects
(Die codeblocks.exe bitte niemals per Doppelklick starten. Das erledigt das VBScript später.)

4.2. MinGW32 und MinGW64 (Compiler)

Nun, da die IDE vorhanden ist, benötigst du noch einen Compiler. Genauer gesagt zwei Compiler, um das Feature nutzen zu können sowohl 32-Bit als auch 64-Bit-Applikationen erstellen zu können.
Beide findest du hier (www.drangon.org/mingw).
Dort gibt es unter der Überschrift "Mingw-w64 (x64) ToolChain"
den Download "mingw-w64-bin-x86_64-YYYYMMDD.7z"
und unter der Überschrift "Mingw-w32 (i686) ToolChain"
den Download "mingw-w32-bin-i686-YYYYMMDD.7z".
Das YYYYMMDD steht dabei für Jahr, Monat und Tag. Wähle die jeweils aktuellste Version. In den Archiven enthalten ist jeweils ein Verzeichnis, "mingw64" bzw. "mingw32".
Beide *.7z Dateien in "CodeBlocksPortable\CodeBlocks" entpacken. Die neue Verzeichnisstruktur sieht nun so aus:
CodeBlocksPortable 
    ├─ Additional_Include 
    ├─ CodeBlocks 
    │      ├─ mingw32 
    │      ├─ mingw64 
    │      ├─ share 
    │      └─ (codeblocks.exe) 
    │ 
    └─ Projects

4.3. Deutsches Menü gefällig?

Wer mit der englischen Menüführung in Code::Blocks glücklich ist, sollte diesen Punkt überspringen. Wer lieber ein weitgehend deutsches Menü bevorzugt, benötigt noch eine zusätzliche Datei "codeblocks.mo". Diese muss in folgendem Pfad liegen:
"CodeBlocksPortable\CodeBlocks\share\CodeBlocks\locale\de_DE"
Nicht existierende Unterverzeichnisse müssen erstellt werden.
Eine Anleitung und die Datei findest du hier (www.opensource-dvd.de/programme/codeblocks.htm).
Die direkte Downloadlocation ist netfile-solution.eu/NetFile-Solution-Download/htdocs/files/codeblocks/
CodeBlocksPortable 
    ├─ Additional_Include 
    ├─ CodeBlocks 
    │      ├─ mingw32 
    │      ├─ mingw64 
    │      ├─ share 
    │      │      └─ CodeBlocks 
    │      │             └─ locale 
    │      │                   └─ de_DE 
    │      │                          └─ (codeblocks.mo) 
    │      │  
    │      └─ (codeblocks.exe) 
    │ 
    └─ Projects
Starte Code::Blocks aber noch nicht. Führe erst alle weiteren Schritte aus.

5. CB-Portable-Launcher.vbs

5.1. Das Script

Mit dem folgenden VBScript wird "codeblocks.exe" mit den entsprechenden Voreinstellungen gestartet. Somit wird "Code::Blocks" zu "Code::Blocks Portable"
Das Script unter dem Name "CB-Portable-Launcher.vbs" im "CodeBlocksPortable" Verzeichnis speichern.
01.
Option Explicit 
02.
 
03.
Const sConfigXML                = "CB-Portable-Config.xml" 
04.
Const adVarChar                 =        200 
05.
Const adVarNumeric              =        139 
06.
Const adTypeText                =          2 
07.
Const adModeReadWrite           =          3 
08.
Const adSaveCreateOverWrite     =          2 
09.
Const wbemFlagReturnImmediately =       &h10 
10.
Const wbemFlagForwardOnly       =       &h20 
11.
Const BIF_RETURNONLYFSDIRS      = &h00000001 
12.
Const BIF_NONEWFOLDERBUTTON     = &h00000200 
13.
 
14.
Function GetOSArchitecture() 
15.
  Dim objWMI, colOS, objOS 
16.
  GetOSArchitecture = "32" 
17.
  Set objWMI = GetObject("winmgmts:\\.\root\CIMV2") 
18.
  Set colOS = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem WHERE NumberOfProcesses > 0", _ 
19.
    "WQL", wbemFlagReturnImmediately Or wbemFlagForwardOnly) 
20.
  For Each objOS In colOS 
21.
    On Error Resume Next 
22.
    If InStr(1, objOS.CreationClassName, "64", vbTextCompare) > 0 Then GetOSArchitecture = "64" 
23.
    If InStr(1, objOS.OSArchitecture, "64", vbTextCompare) > 0 Then GetOSArchitecture = "64" 
24.
    On Error Goto 0 
25.
  Next 
26.
End Function 
27.
 
28.
Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO) 
29.
  Dim objFolder, strThisFolder, strSelectedFolder, iDiff, iThisFolder 
30.
  GetRelFolder = "" 
31.
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName) 
32.
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _ 
33.
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder) 
34.
  If Not objFolder Is Nothing Then 
35.
    strSelectedFolder = objFolder.Self.Path 
36.
    iThisFolder = Len(strThisFolder) 
37.
    If Left(strSelectedFolder, iThisFolder) = strThisFolder Then 
38.
      If iThisFolder = 3 Then iThisFolder = 2 
39.
      iDiff = Len(strSelectedFolder) - iThisFolder 
40.
      GetRelFolder = Right(strSelectedFolder, iDiff - 1) 
41.
      If Not oFSO.FolderExists(GetRelFolder) Then GetRelFolder = "" 
42.
    End If 
43.
  End If 
44.
End Function 
45.
 
46.
Sub GetAllProjects(ByRef oFolder, ByRef oADOR, ByRef oFSO) 
47.
  Dim oFile, oSubfolder, sFilePath 
48.
  For Each oFile In oFolder.Files 
49.
    sFilePath = oFile.Path 
50.
    If LCase(oFSO.GetExtensionName(sFilePath)) = "layout" Then 
51.
      oADOR.AddNew Array("vcPath", "vnDateLastMod"), Array(Mid(sFilePath, 1, Len(sFilePath) - 6) & "cbp", _ 
52.
        CDbl(DateDiff("s", CDate(0), oFile.DateLastModified))) 
53.
    End If 
54.
  Next 
55.
  For Each oSubfolder In oFolder.SubFolders 
56.
    If oSubfolder.Name <> "_archive_" Then GetAllProjects oSubfolder, oADOR, oFSO 
57.
  Next 
58.
End Sub 
59.
 
60.
Sub CreateXMLFile(ByVal p1, ByVal p2, ByVal p3, ByRef oFSO) 
61.
  With oFSO.CreateTextFile(sConfigXML) 
62.
    .Write "<?xml version=""1.0"" encoding=""Windows-1252"" standalone=""yes""?>" & vbCrLf & _ 
63.
      "<!-- Einstellungen für CB-Portable-Launcher -->" & vbCrLf & _ 
64.
      "<CB_Portable_Launcher_Config version=""1"">" & vbCrLf & _ 
65.
      vbTab & "<relative_pathes description=""Die path-Attribute geben die relativen Pfade an."">" & vbCrLf & _ 
66.
      vbTab & vbTab & "<CBDir path=""" & p1 & """ description=""Pfad zum CodeBlocks - Rootverzeichnis, RELATIV zum Script"" />" & vbCrLf & _ 
67.
      vbTab & vbTab & "<ProjDir path=""" & p2 & """ description=""Pfad zum Projects - Rootverzeichnis, RELATIV zum Script"" />" & vbCrLf & _ 
68.
      vbTab & vbTab & "<AdditionalIncludeDir path=""" & p3 & """ description=""Pfad zum Additional_Include - Rootverzeichnis, RELATIV zum Script"" />" & vbCrLf & _ 
69.
      vbTab & "</relative_pathes>" & vbCrLf & _ 
70.
      "</CB_Portable_Launcher_Config>" 
71.
    .Close 
72.
  End With 
73.
End Sub 
74.
 
75.
Sub CreateConfFile(ByVal sConfFile) 
76.
  ' ggf. "default.conf" mit Voreinstellungen anlegen 
77.
  Dim oADOTxtS 
78.
  Set oADOTxtS = CreateObject("ADODB.Stream") 
79.
  With oADOTxtS 
80.
    .Type = adTypeText 
81.
    .Mode = adModeReadWrite 
82.
    .Charset = "UTF-8" 
83.
    .Open 
84.
    .WriteText "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>" & _ 
85.
      "<CodeBlocksConfig version=""1""><app>" & _ 
86.
      "<environment><CHECK_ASSOCIATIONS bool=""0"" /></environment>" & _ 
87.
      "<SHOW_TIPS bool=""0"" /><RECENT_PROJECTS><astr /></RECENT_PROJECTS>" & _ 
88.
      "<locale><ENABLE bool=""1"" /></locale></app>" & _ 
89.
      "<project_manager><DEFAULT_PATH><str /></DEFAULT_PATH></project_manager>" & _ 
90.
      "<compiler><build_progress />" & _ 
91.
      "<SETTINGS_VERSION><str><![CDATA[0.0.3]]></str></SETTINGS_VERSION>" & _ 
92.
      "<sets><gcc><NAME><str><![CDATA[GNU GCC Compiler]]></str></NAME>" & _ 
93.
      "<LINKER_OPTIONS><str><![CDATA[-static-libgcc;-static-libstdc++;]]></str></LINKER_OPTIONS>" & _ 
94.
      "<MASTER_PATH><str /></MASTER_PATH>" & _ 
95.
      "<C_COMPILER><str><![CDATA[gcc.exe]]></str></C_COMPILER>" & _ 
96.
      "<CPP_COMPILER><str><![CDATA[g++.exe]]></str></CPP_COMPILER>" & _ 
97.
      "<LINKER><str><![CDATA[g++.exe]]></str></LINKER>" & _ 
98.
      "<MAKE><str><![CDATA[make.exe]]></str></MAKE></gcc></sets>" & _ 
99.
      "<DEFAULT_COMPILER><str><![CDATA[gcc]]></str></DEFAULT_COMPILER>" & _ 
100.
      "</compiler><debugger_common><sets><gdb_debugger><conf1>" & _ 
101.
      "<NAME><str><![CDATA[Default]]></str></NAME>" & _ 
102.
      "<values><EXECUTABLE_PATH><str /></EXECUTABLE_PATH></values>" & _ 
103.
      "</conf1></gdb_debugger></sets></debugger_common></CodeBlocksConfig>" 
104.
    .Position = 0 
105.
    .SaveToFile sConfFile, adSaveCreateOverWrite 
106.
    .Close 
107.
  End With 
108.
End Sub 
109.
 
110.
Sub ChangeConf(ByVal sConfFile, ByVal sProjDir, ByVal sAIncludeDir, ByVal sMinGWDir, ByRef oADOR, ByRef oFSO) 
111.
  Dim oXmlDoc, oNode, oNodeItem, i 
112.
  Set oXmlDoc = CreateObject("Microsoft.XMLDOM") 
113.
  oXmlDoc.async = False 
114.
  oXmlDoc.validateOnParse = False 
115.
  oXmlDoc.resolveExternals = False 
116.
  oXmlDoc.load(sConfFile) 
117.
  If oXmlDoc.parseError.errorCode = 0 Then 
118.
    ' Pfad zu MinGW anpassen 
119.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/MASTER_PATH/str") 
120.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
121.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
122.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/MASTER_PATH") 
123.
    oNode.appendChild oNodeItem 
124.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/MASTER_PATH/str") 
125.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir) 
126.
    oNode.appendChild oNodeItem 
127.
    ' Pfad zu Debugger anpassen 
128.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH/str") 
129.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
130.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
131.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH") 
132.
    oNode.appendChild oNodeItem 
133.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH/str") 
134.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir & "\bin\gdb.exe") 
135.
    oNode.appendChild oNodeItem 
136.
    ' Default Projektpfad anpassen 
137.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//project_manager/DEFAULT_PATH/str") 
138.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
139.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
140.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//project_manager/DEFAULT_PATH") 
141.
    oNode.appendChild oNodeItem 
142.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//project_manager/DEFAULT_PATH/str") 
143.
    Set oNodeItem = oXmlDoc.createCDATASection(sProjDir & "\") 
144.
    oNode.appendChild oNodeItem 
145.
    ' Pfad zu Includes anpassen 
146.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/INCLUDE_DIRS") 
147.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
148.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc") 
149.
    Set oNodeItem = oXmlDoc.createElement("INCLUDE_DIRS") 
150.
    oNode.appendChild oNodeItem 
151.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/INCLUDE_DIRS") 
152.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
153.
    oNode.appendChild oNodeItem 
154.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/INCLUDE_DIRS/str") 
155.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir & "\mingw\include;" & sAIncludeDir & ";") 
156.
    oNode.appendChild oNodeItem 
157.
    ' Pfad zu Libraries anpassen 
158.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/LIBRARY_DIRS") 
159.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
160.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc") 
161.
    Set oNodeItem = oXmlDoc.createElement("LIBRARY_DIRS") 
162.
    oNode.appendChild oNodeItem 
163.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/LIBRARY_DIRS") 
164.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
165.
    oNode.appendChild oNodeItem 
166.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/LIBRARY_DIRS/str") 
167.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir & "\mingw\lib;") 
168.
    oNode.appendChild oNodeItem 
169.
    ' Projects zu RECENT_PROJECTS hinzufügen 
170.
    If oADOR.RecordCount > 0 Then 
171.
      i = 0 
172.
      Set oNode = oXmlDoc.documentElement.selectSingleNode("//app/RECENT_PROJECTS/astr") 
173.
      If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
174.
      Set oNodeItem = oXmlDoc.createNode(1, "astr", "") 
175.
      Set oNode = oXmlDoc.documentElement.selectSingleNode("//app/RECENT_PROJECTS") 
176.
      oNode.appendChild oNodeItem 
177.
      Set oNode = oXmlDoc.documentElement.selectSingleNode("//app/RECENT_PROJECTS/astr") 
178.
      While Not oADOR.EOF And i < 20 
179.
        If oFSO.FileExists(oADOR("vcPath")) Then 
180.
          Set oNodeItem = oXmlDoc.createNode(1, "s", "") 
181.
          oNode.appendChild oNodeItem 
182.
          Set oNodeItem = oXmlDoc.createCDATASection(oADOR("vcPath")) 
183.
          oNode.childNodes(i).appendChild oNodeItem 
184.
          i = i + 1 
185.
        End If 
186.
        oADOR.MoveNext 
187.
      Wend 
188.
    End If 
189.
    oXmlDoc.save(sConfFile) 
190.
  Else 
191.
    MsgBox oXmlDoc.parseError.reason & vbCrLf & _ 
192.
      "Der Pfad zu MinGW konnte in Datei" & vbCrLf & """" & sConfFile & """" & _ 
193.
      vbCrLf & "nicht angepasst werden." & vbCrLf & _ 
194.
      "Voraussichtlich kann Code::Blocks den Compiler nicht aufrufen.", _ 
195.
      vbExclamation Or vbSystemModal, "Fehler" 
196.
  End If 
197.
End Sub 
198.
 
199.
Sub main() 
200.
  Dim CBDir, ProjDir, AdditionalIncludeDir, _ 
201.
    oFSO, oWSH, oADOR, oXmlDoc, oNode, oProjDir, oEnv, _ 
202.
    sCBDir, sProjDir, sConfFile, sAIncludeDir, sMinGWDir, sAppdataDir, sOS, _ 
203.
    arrPath, i 
204.
 
205.
  Set oFSO = CreateObject("Scripting.FileSystemObject") 
206.
  Set oWSH = CreateObject("WScript.Shell") 
207.
  Set oADOR = CreateObject("ADODB.Recordset") 
208.
  ' sicherstellen, dass das Ausgangsarbeitsverzeichnis dem Scriptverzeichnis entspricht 
209.
  oWSH.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName) 
210.
  ' ggf. xml erzeugen 
211.
  If Not oFSO.FileExists(sConfigXML) Then 
212.
    Do 
213.
      If MsgBox("Wählen Sie nachfolgend das Verzeichnis aus, " & _ 
214.
        "in dem ""codeblocks.exe"" zu finden ist." & vbLf & _ 
215.
        "Dieser Schritt wird wiederholt, wenn ""codeblocks.exe"" nicht " & _ 
216.
        "in einem Unterverzeichnis relativ zu diesem Script liegt.", _ 
217.
        vbOKCancel Or vbInformation Or vbSystemModal, "Code::Blocks - Verzeichnis") _ 
218.
        = vbCancel Then WScript.Quit 
219.
      CBDir = GetRelFolder("Code::Blocks", BIF_RETURNONLYFSDIRS Or BIF_NONEWFOLDERBUTTON, oFSO) 
220.
    Loop While CBDir = "" 
221.
    Do 
222.
      If MsgBox("Wählen Sie nachfolgend das Verzeichnis aus, " & _ 
223.
        "in dem Ihre Projekte gespeichert werden." & vbLf & _ 
224.
        "Dieser Schritt wird wiederholt, wenn es sich nicht " & _ 
225.
        "um ein Unterverzeichnis relativ zu diesem Script handelt.", _ 
226.
        vbOKCancel Or vbInformation Or vbSystemModal, "Projects - Verzeichnis") _ 
227.
        = vbCancel Then WScript.Quit 
228.
      ProjDir = GetRelFolder("Projects", BIF_RETURNONLYFSDIRS, oFSO) 
229.
    Loop While ProjDir = "" 
230.
    Do 
231.
      If MsgBox("Wählen Sie nachfolgend das Verzeichnis aus, " & _ 
232.
        "in dem Sie weitere Dateien ablegen können, die Sie in Ihre Codes einbeziehen wollen." & vbLf & _ 
233.
        "Dieser Schritt wird wiederholt, wenn es sich nicht " & _ 
234.
        "um ein Unterverzeichnis relativ zu diesem Script handelt.", _ 
235.
        vbOKCancel Or vbInformation Or vbSystemModal, "Additional_Include - Verzeichnis") _ 
236.
        = vbCancel Then WScript.Quit 
237.
      AdditionalIncludeDir = GetRelFolder("Additional_Include", BIF_RETURNONLYFSDIRS, oFSO) 
238.
    Loop While AdditionalIncludeDir = "" 
239.
    CreateXMLFile CBDir, ProjDir, AdditionalIncludeDir, oFSO 
240.
    MsgBox "Ihre Einstellungen wurden in """ & sConfigXML & _ 
241.
      """ abgelegt und können nachträglich in den ""path""-Attributen geändert werden.", _ 
242.
      vbInformation Or vbSystemModal, sConfigXML 
243.
  End If 
244.
  ' Einstellungen aus xml lesen 
245.
  Set oXmlDoc = CreateObject("Microsoft.XMLDOM") 
246.
  oXmlDoc.async = False 
247.
  oXmlDoc.load(sConfigXML) 
248.
  If oXmlDoc.parseError.errorCode = 0 Then 
249.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//relative_pathes/CBDir") 
250.
    CBDir = oNode.getAttribute("path") 
251.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//relative_pathes/ProjDir") 
252.
    ProjDir = oNode.getAttribute("path") 
253.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//relative_pathes/AdditionalIncludeDir") 
254.
    AdditionalIncludeDir = oNode.getAttribute("path") 
255.
  Else 
256.
    MsgBox "Fehler in Datei """ & sConfigXML & """" & vbCrLf & oXmlDoc.parseError.reason, _ 
257.
      vbCritical Or vbSystemModal, "Fehler" 
258.
    WScript.Quit 
259.
  End If 
260.
  ' Projects Verzeichnis 
261.
  ProjDir = Trim(Replace(ProjDir, "/", "\")) 
262.
  If Not oFSO.FolderExists(ProjDir) Then 
263.
    arrPath = Split(ProjDir, "\") 
264.
    If (arrPath(0) = "" Or InStr(1, arrPath(0), ":", vbTextCompare) > 0) Then 
265.
      MsgBox "Der Pfad" & vbCrLf & """" & ProjDir & """" & _ 
266.
        vbCrLf & "ist nicht relativ zum Script auflösbar." & vbCrLf & _ 
267.
        "Ändern Sie den Pfad in " & sConfigXML & " entsprechend.", _ 
268.
        vbExclamation Or vbSystemModal, "Fehler" 
269.
      WScript.Quit 
270.
    Else 
271.
      ProjDir = "" 
272.
      For i = 0 To UBound(arrPath) 
273.
        If arrPath(i) = "" Then Exit For 
274.
        ProjDir = ProjDir & arrPath(i) 
275.
        If Not oFSO.FolderExists(ProjDir) Then oFSO.CreateFolder(ProjDir) 
276.
        ProjDir = ProjDir & "\" 
277.
      Next 
278.
    End If 
279.
  End If 
280.
  sProjDir = oFSO.BuildPath(oWSH.CurrentDirectory, ProjDir) ' absoluter Pfad 
281.
  Set oProjDir = oFSO.GetFolder(sProjDir) 
282.
  sProjDir = oProjDir.Path 
283.
  ' Additional_Include Verzeichnis 
284.
  AdditionalIncludeDir = Trim(Replace(AdditionalIncludeDir, "/", "\")) 
285.
  If Not oFSO.FolderExists(AdditionalIncludeDir) Then 
286.
    arrPath = Split(AdditionalIncludeDir, "\") 
287.
    If (arrPath(0) = "" Or InStr(1, arrPath(0), ":", vbTextCompare) > 0) Then 
288.
      MsgBox "Der Pfad" & vbCrLf & """" & AdditionalIncludeDir & """" & _ 
289.
        vbCrLf & "ist nicht relativ zum Script auflösbar." & vbCrLf & _ 
290.
        "Ändern Sie den Pfad in " & sConfigXML & " entsprechend.", _ 
291.
        vbExclamation Or vbSystemModal, "Fehler" 
292.
      WScript.Quit 
293.
    Else 
294.
      AdditionalIncludeDir = "" 
295.
      For i = 0 To UBound(arrPath) 
296.
        If arrPath(i) = "" Then Exit For 
297.
        AdditionalIncludeDir = AdditionalIncludeDir & arrPath(i) 
298.
        If Not oFSO.FolderExists(AdditionalIncludeDir) Then oFSO.CreateFolder(AdditionalIncludeDir) 
299.
        AdditionalIncludeDir = AdditionalIncludeDir & "\" 
300.
      Next 
301.
    End If 
302.
  End If 
303.
  sAIncludeDir = oFSO.BuildPath(oWSH.CurrentDirectory, AdditionalIncludeDir) ' absoluter Pfad 
304.
  sAIncludeDir = oFSO.GetFolder(sAIncludeDir).Path 
305.
  ' in CodeBlocks - Rootverzeichnis wechseln 
306.
  CBDir = Trim(Replace(CBDir, "/", "\")) 
307.
  If Not oFSO.FolderExists(CBDir) Then 
308.
    MsgBox "Der Pfad" & vbCrLf & """" & CBDir & """" & _ 
309.
      vbCrLf & "existiert nicht." & vbCrLf & _ 
310.
      "Ändern Sie den Pfad in " & sConfigXML & " entsprechend.", _ 
311.
      vbExclamation Or vbSystemModal, "Fehler" 
312.
    WScript.Quit 
313.
  End If 
314.
  oWSH.CurrentDirectory = CBDir 
315.
  ' Prüfen ob codeblocks.exe existiert 
316.
  If Not oFSO.FileExists("codeblocks.exe") Then 
317.
    MsgBox """codeblocks.exe"" konnte nicht gefunden werden." & vbLf & _ 
318.
      "Prüfen Sie den Pfad in """ & sConfigXML & """.", _ 
319.
      vbCritical Or vbSystemModal, "Fehler" 
320.
    WScript.Quit 
321.
  End If 
322.
  ' Projects Dateien suchen und absteigend nach Datum sortieren (basierend auf *.layout Dateien) 
323.
  oADOR.Fields.Append "vcPath", adVarChar, 255 
324.
  oADOR.Fields.Append "vnDateLastMod", adVarNumeric, 8 
325.
  oADOR.Open 
326.
  GetAllProjects oProjDir, oADOR, oFSO 
327.
  If oADOR.RecordCount > 0 Then oADOR.Sort = "vnDateLastMod DESC" 
328.
  ' OS Architektur / Abfrage 
329.
  sOS = GetOSArchitecture 
330.
  If sOS = "64" Then 
331.
    If MsgBox("Sollen 64-Bit-Anwendungen erstellt werden?", _ 
332.
      vbYesNo Or vbQuestion Or vbSystemModal, "Windows x64 detektiert.") _ 
333.
      = vbNo Then sOS = "32" 
334.
  End If 
335.
  ' Pfade 
336.
  sCBDir = oWSH.CurrentDirectory ' resultiert zum absoluten Pfad 
337.
  sConfFile = oFSO.BuildPath(sCBDir, "AppData\codeblocks\default.conf") 
338.
  sMinGWDir = oFSO.BuildPath(sCBDir, "mingw" & sOS) 
339.
  sAppdataDir = oFSO.BuildPath(sCBDir, "AppData") 
340.
  ' Konfiguration anpassen 
341.
  If Not oFSO.FileExists(sConfFile) Then 
342.
    If Not oFSO.FolderExists(sAppdataDir) Then oFSO.CreateFolder(sAppdataDir) 
343.
    If Not oFSO.FolderExists(sAppdataDir & "\codeblocks") Then oFSO.CreateFolder(sAppdataDir & "\codeblocks") 
344.
    CreateConfFile sConfFile 
345.
  End If 
346.
  ChangeConf sConfFile, sProjDir, sAIncludeDir, sMinGWDir, oADOR, oFSO 
347.
  oADOR.Close 
348.
  ' APPDATA in der Prozessumgebung ändern 
349.
  Set oEnv = oWSH.Environment("PROCESS") 
350.
  oEnv("APPDATA") = sAppdataDir 
351.
  ' Code::Blocks starten 
352.
  oWSH.Run "codeblocks.exe" 
353.
  WScript.Sleep 1500 
354.
End Sub 
355.
 
356.
main
CodeBlocksPortable 
    ├─ Additional_Include 
    ├─ CodeBlocks 
    │      ├─ mingw32 
    │      ├─ mingw64 
    │      ├─ share 
    │      └─ (codeblocks.exe) 
    │ 
    ├─ Projects 
    └─ (CB-Portable-Launcher.vbs)
5.1.1. Script speichern - How To
Wie ich erfahren habe, fällt es manch einem schwer den Code aus dem Forum als VBScript abzuspeichern.
  • Rechts über dem Code gibt es den Link "Quelltext". Bei Mausklick öffnet sich ein neues Fester mit dem Code in Plaintext.
  • Den gesamten Code markieren ([Strg]+[A]) und kopieren ([Strg]+[C]).
  • Den Windows Editor öffnen. Bspw. so:
    • Tastenkombination [Windows]+[R],
    • notepad.exe in den geöffneten "Ausführen" Dialog schreiben,
    • OK anklicken.
  • Den kopierten Code einfügen ([Strg]+[V]).
  • Menü Datei -> Speichern unter...
  • In das CodeBlocksPortable Verzeichnis navigieren
  • Codierung auf ANSI stellen, Dateityp Alle Dateien (*.*) auswählen, Dateiname CB-Portable-Launcher.vbs

2bc762ffc93b1837c47c0db5dbae85b6 - Klicke auf das Bild, um es zu vergrößern

  • Speichern.

5.2. Der erste Start

Nun ist alles für den ersten Run bereit. Durch Doppelklick auf "CB-Portable-Launcher.vbs" wird das Script gestartet. Dieses prüft zunächst die Umgebung und wird feststellen, dass noch Dateien und Verzeichnisse fehlen. Kein Problem, du wirst durch die nächsten Schritte geführt. Zunächst wirst du nach dem "CodeBlocks" Verzeichnis gefragt. Dieses wählst du aus und bestätigst. Das gleiche für die Verzeichnisse "Projects" und "Additional_Include".
Code::Blocks öffnet sich und belästigt dich noch einmal damit den Default Compiler "GNU GCC Compiler" zu bestätigen. Achtung! Diese Meldung ist ggf. hinter anderen geöffneten Fenstern versteckt, sodass es den Anschein hat, Code::Blocks würde nicht starten. Minimiere in diesem Fall nacheinander alle geöffneten Fenster ...
(Diese Prozedur gibt es wirklich nur beim ersten Start.)

Geschafft! Nun kannst du endlich loslegen ...


6. Weitere Informationen

  • Wie funktioniert das Script eigentlich?
Code::Blocks benötigt die Datei "default.conf", ein XML File welches sämtliche Einstellungen der IDE enthält. Diese Datei würde normalerweise im AppData Verzeichnis deines Benutzerprofils angelegt werden. Das Script erstellt zunächst einen Prototyp dieser Datei unter "CodeBlocksPortable\CodeBlocks\AppData\codeblocks" und speichert dort die Lage des Compilers, deiner Projekte und weitere Einstellungen. Diese Einstellungen werden bei jedem Start durch das Script aktualisiert. Weiterhin wird die Umgebungsvariable %AppData% für den codeblocks.exe Prozess dahingehend geändert, dass Code::Blocks die so veränderte "default.conf" lädt statt in deinem Benutzerprofil zu suchen. Code::Blocks wird in dieser Umgebung gestartet und mutiert somit zur "Portable App".

  • Warum kann ich auf einem x86 System kein x64 Programm erstellen?
Der Compiler für 64-Bit-Applikationen ist selbst ein 64-Bit-Programm. Das läuft natürlich nicht auf einem 32-Bit System.
Umgekehrt funktioniert das aber. Du kannst 32-Bit-Programme unter einem 64-Bit Betriebssystem kompilieren. Aus diesem Grund fragt dich das Script auf einem 64-Bit System, welcher Compiler heran gezogen werden soll.

  • Warum wird mein bestehendes Projekt nicht neu kompiliert?
Code::Blocks prüft im Vorfeld, ob der Quellcode sich zum Stand der Object-Dateien geändert hat. Unveränderte Quelldateien werden nicht neu kompiliert. Das kann zu merkwürdigen Fehlermeldungen führen, wenn ein Projekt, das zuvor mit dem 32-Bit Compiler bearbeitet wurde, erneut über den 64-Bit Compiler läuft (oder auch umgekehrt).
Eine Neukompilierung lässt sich jedoch forcieren, indem man einfach auf "Neu erstellen" d3a34efa34cd89e564b2fbba1a9724d1 - Klicke auf das Bild, um es zu vergrößern klickt oder das "obj" Subverzeichnis aus dem Projektordner löscht.

  • Warum sind die Linkeroptionen -static-libgcc und -static-libstdc++ voreingestellt?
MinGW erstellt normalerweise Applikationen mit Abhängigkeit zu dynamisch gelinkten Bibliotheken (im "bin" bzw. "lib" Verzeichnis des Compilers zu finden). Um zu vermeiden, dass diese DLLs bei jedem Programm mitgeliefert werden müssen, werden die entsprechenden Libraries statisch gelinkt.

  • Warum kennt der Compiler den C11 oder C++14 Standard nicht?
Unterschiedliche Compiler unterstützen die neuesten Standards mehr oder weniger vollständig. Auch MinGW hat längst nicht alles implementiert. Wenn jedoch gar keine der neuen Features nutzbar sind, dann liegt es vermutlich daran, dass die entsprechenden Compiler-Optionen nicht übergeben werden. Code::Blocks setzt diese nicht standardmäßig. Folgendes ist nötig:
    1. Menü "Settings" ("Einstellungen")
    2. "Compiler..."
    3. Ein neues Fenster öffnet sich mit dem übergeordneten Tab "Compiler settings"
    4. Untergeordneter Tab "Other Options" ("Andere Optionen")
    5. In die Textbox -std=c11 und -std=c++1y untereinander schreiben
    6. Mit OK bestätigen.

  • Ich möchte den Compiler auf aktuellem Stand halten. Wie kann ich das tun?
Eine automatische Updatefunktion ist mit VBScript kaum machbar. Du kannst aber ab und zu auf drangon.org nachschauen, ob es eine neue Version gibt. Wenn das so sein sollte, lösche die Verzeichnisse "mingw32" und "mingw64" aus dem "CodeBlocks" Unterverzeichnis. Verfahre dann wie in Punkt 4.2. beschrieben, um dieselben Verzeichnisse mit den neusten Versionen wieder hinzuzufügen.

Änderungen:
  • 28.02.2016 Script: Kleinere Änderungen. Explizites Zerstören von Objekten entfernt (es ist davon auszugehen, dass der Garbagecollector das selbständig besser kann).
  • 25.02.2016 Script: Bugfix für relative Pfade, wenn das Arbeitsverzeichnis des Scripts das Rootverzeichnis des Laufwerks ist. (Danke @nrt4ipok !)
  • 07.02.2016 Script: SETTINGS_VERSION für Code::Blocks ab Ver. 16.01 aktualisiert. Support für _archive_ Verzeichnis hinzu.
  • 07.02.2016 Text: Punkt 2.1., 3. , 4.1. und 5.2. aktualisiert, Anleitung für C++14 Support entsprechend geändert, Anleitung für Compilerupdate hinzu.
  • 02.05.2015 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 29.12.2014 Text: Anleitung für C(++)11 Support hinzu
  • 29.11.2014 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 26.10.2014 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst, Visualisierung aktualisiert
  • 27.08.2014 Text: direkte Location der codeblocks.mo hinzu
  • 03.01.2014 Text: Punkt 3. ergänzt, Punkt 5.1.1. hinzu
  • 01.01.2014 Text: Abbildung und Beschreibung "Neu erstellen" hinzu
  • 07.12.2013 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 12.04.2013 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 02.03.2013 Script: Aktualisierung Debugger hinzugefügt

Mitglied: bugmenot2
22.03.2013 um 08:51 Uhr
Klasse Arbeit, funktioniert super.
Kleiner Hinweis noch, das vbs Script muss als Unicode gespeichert werden, sonst Fehlermeldung.
Ansonsten danke für die Mühe
Bitte warten ..
Mitglied: rubberman
22.03.2013, aktualisiert 23.03.2013
Hallo bugmenot2,

vielen Dank für dein Feedback Freut mich zu hören!

Ich habe mein Originalscript noch mal mit einem HEX-Editor geöffnet um zu prüfen ob es tatsächlich im Unicodeformat gespeichert ist. Fehlanzeige. Es ist ANSI (Windows 1252), so wie es die meisten Texteditoren per Default speichern.
Magst du noch die Fehlermeldung nebst Zeilennummer posten, damit ich der Sache auf den Grund gehen kann? Interessant wäre auch auf welchem OS du das getestet hast und ob du ggf. Zeichen in den Pfaden hast, die sich mit ANSI nicht mehr darstellen lassen, also breiter als 8 Bit sind.


Grüße
rubberman

EDIT:
Ich habe einfach mal ein paar gängige Zeichensätze getestet.
  • ANSI (CP 1252) Funktioniert (zumindest bei mir).
  • ASCII (CP 850) Funktioniert, auch wenn Umlaute natürlich falsch dargestellt werden da die Interpretation als ANSI Zeichensatz ausgeführt wird.
  • UTF-16(LE) Funktioniert, wie auch von dir getestet.
  • UTF-16(BE) Script bricht mit Fehlermeldung "Ungültiges Zeichen" in Zeile 1, Zeichen 1 ab. Hier wird offensichtlich bereits über das Byte Order Mark gemeckert. VBScript unterstützt diesen Zeichensatz grundsätzlich nicht.
  • UTF-8 Funktioniert nicht. Hier gilt das gleiche wie für UTF-16 Big Endian.
Bitte warten ..
Mitglied: Friemler
24.10.2014, aktualisiert um 10:52 Uhr
Hallo rubberman,

ich benutze Die Lösung aus Deiner Anleitung jetzt schon seit längerem, habe es nur bisher vergessen, Dich dafür auch mal zu loben. Wirklich eine gute Arbeit und Du hältst sie sogar auf dem neuesten Stand. Danke dafür und weiter so! Solche Beiträge machen das Internet wertvoll.

Ich hätte ja auch noch gerne einen Stern vergeben, finde aber die Bewertungs-Smileys nicht...

Gruß
Friemler
Bitte warten ..
Mitglied: rubberman
24.10.2014, aktualisiert um 16:12 Uhr
Hallo Friemler.

Ich hätte ja auch noch gerne einen Stern vergeben, finde aber die Bewertungs-Smileys nicht...

Ach was, ich brauche keine Sternchen Feedback jeglicher Art freut mich viel mehr. So weiß ich, ob etwas (nicht nur für mich) funktioniert und nützlich ist und ob es etwas gibt, was ich optimieren könnte. Also danke dafür! (und du bekommst deshalb ein Sternchen von mir )

Grüße
rubberman
Bitte warten ..
Mitglied: 120263
31.01.2015 um 09:53 Uhr
Sehr geehrter Rubberman,
Danke erst einmal für Ihre Mühen, die Sie sich machen!

Ich habe ein Problem mit dem VB Script. Es fragt mich in einer Endlosschleife nach dem Verzeichnis, in dem die Code::Blocks exe liegt....? Was läuft da falsch? Können Sie mir da weiterhelfen?

Ich habe Code::Blocks auf einem 32GB USB Stick installiert.
Der Stick hat den Namen Code:BlocksPortable
Die Verzeichnisstruktur ist so angelegt, wie unter Punkt 4.3 zu sehen ist.

Freundlicher Gruß
Ralph Hoffmann
Bitte warten ..
Mitglied: rubberman
31.01.2015, aktualisiert um 12:51 Uhr
Hallo RalphHoffmann, willkommen im Forum.

[OT]
Es ist in Internetforen allgemein üblich, dass man sich duzt. Das ist keine Respektlosigkeit und hat auch nichts damit zu tun, wie man sich normalerweise Fremden gegenüber auf der Straße verhalten würde Ein freundliches "Hallo" gehört allerdings (zumindest in diesem Forum) nach wie vor zur Netiquette und wird gern gesehen.
[/OT]

Dass das Script beim ersten Start nach den Verzeichnissen fragt, ist normal. Es öffnet sich ein sogenannter "BrowseForFolder" Dialog, bei dem man die entsprechenden Verzeichnisse auswählen muss. Siehe dazu Punkt 5.2. Der Hintergrund dafür ist, dass man (wie in Punkt 3. angemerkt) durchaus auch andere Verzeichnisnamen verwenden könnte. Aus diesem Grund werden diese Einstellungen über dieses Benutzerinterface vorgenommen.

Das Script ist vielfach getestet ohne dass diese Problem jemals aufgetreten ist. Anhand der Fehlerbeschreibung kann ich leider auch keinen Grund für das Fehlverhalten erkennen.

Was kannst du tun:
  1. Öffne den Task-Manager, wechsle in den Tab "Prozesse" und beende alle "wscript.exe" und "codeblocks.exe" Prozesse, falls solche laufen.
  2. Navigiere im Explorer in das CodeBlocksPortable Verzeichnis. Falls dort die Datei CB-Portable-Config.xml bereits angelegt wurde, lösche diese. Wechsle in das CodeBlocks Unterverzeichnis und lösche dort das Verzeichnis AppData, sofern bereits vorhanden.
  3. Starte das Script CB-Portable-Launcher.vbs erneut und verfahre wie in Punkt 5.2. angegeben.
  4. Falls das nicht zum Erfolg führt, wiederhole das Beenden der Prozesse und das Löschen der XML Datei.
  5. Benenne alle Verzeichnisse und Unterverzeichnisse exakt so, wie in Punkt 4.3 zu sehen ist. (Der Name des Datenträgers ist übrigens nicht von Interesse, wichtig ist lediglich dass darin ein Hauptverzeichnis CodeBlocksPortable liegt, auf das die restliche Verzeichnisstruktur aufbaut.)
  6. Lege im Verzeichnis CodeBlocksPortable eine neue Textdatei an und speichere dort folgenden Inhalt:
01.
<?xml version="1.0" encoding="Windows-1252" standalone="yes"?> 
02.
<!-- Einstellungen für CB-Portable-Launcher --> 
03.
<CB_Portable_Launcher_Config version="1"> 
04.
	<relative_pathes description="Die path-Attribute geben die relativen Pfade an."> 
05.
		<CBDir path="CodeBlocks" description="Pfad zum CodeBlocks - Rootverzeichnis, RELATIV zum Script" /> 
06.
		<ProjDir path="Projects" description="Pfad zum Projects - Rootverzeichnis, RELATIV zum Script" /> 
07.
		<AdditionalIncludeDir path="Additional_Include" description="Pfad zum Additional_Include - Rootverzeichnis, RELATIV zum Script" /> 
08.
	</relative_pathes> 
09.
</CB_Portable_Launcher_Config>
Benenne die Datei zu CB-Portable-Config.xml um. Nun starte das Script erneut.

Ich würde mich sehr über Feedback freuen, ob einer der Lösungsvorschläge funktioniert hat, oder ob du die Ursache für das Fehlverhalten herausfinden konntest. Danke!

Grüße
rubberman
Bitte warten ..
Mitglied: knirschke
19.12.2015 um 22:38 Uhr
Hallo rubberman,

das hast Du sehr gut gemacht.
Hat auf Anhieb geklappt...
Vielen Dank !

knirschke von zahnstein
Bitte warten ..
Mitglied: rubberman
21.12.2015, aktualisiert um 12:43 Uhr
Hallo knirschke,

danke für dein Feedback
Wenn dir was auffällt oder fehlt, melde dich bitte hier.

Grüße
rubberman
Bitte warten ..
Mitglied: nrt4ipok
24.02.2016, aktualisiert um 18:39 Uhr
Hallo RalphHoffmann

Hab das selbe Problem mit Win10 64 bit gehabt, gelöst durch ändern der Funktion "Right" in Zeile 39 von Script

alt:
01.
        strRel = Right(strSelectedFolder, iDiff - 1)
neu:
01.
        strRel = Right(strSelectedFolder, iDiff)
hatte aber auch danach ein komisches Fhänomen. Nach ersten Start + mehrfache Versuche da nix kam ... musste ich feststellen das es einfach nichts angezeigt wurde.
Lösung: mit ALT + TAB die CB Compilerauswahl selektieren.

ob Dies am OS liegt kann ich nicht beurteilen da ich bis heute noch nie was mit Windows-Programmierung zutun hatte.

Ich hoffe das hilft
Grüße
Bitte warten ..
Mitglied: rubberman
24.02.2016 um 21:48 Uhr
Hallo nrt4ipok, willkommen im Forum.

Leider hat sich der Benutzer RalphHoffmann hier im Forum abgemeldet. Ich fürchte wir werden nicht erfahren, ob dein Vorschlag für ihn hilfreich war.
Wie auch immer, ich bin über jegliches Feedback dankbar. Leider kann ich das Fehlverhalten des Scripts noch nicht nachvollziehen. Sobald ich die von dir vorgeschlagene Änderung vornehme, verändert sich der erzeugte Pfad dahingehend, dass der vorangestellte Backslash des Verzeichnisses erhalten bleibt. Beispiel:
aus
Additional_Include
wird
\Additional_Include

Nehmen wir an, das Verzeichnis hat folgenden absoluten Pfad:
D:\CodeBlocksPortable\Additional_Include
und das Script hat das Arbeitsverzeichnis
D:\CodeBlocksPortable
Dann würde
\Additional_Include
als
D:\Additional_Include
interpretiert, was aber nicht existieren würde.

Du wärst eine große Hilfe, wenn du mir die absoluten Pfade der Verzeichnisse schreiben könntest, bei denen das Script bei dir fehlgeschlagen ist. Vielleich gelingt es mir nachzustellen, woran es hapert. Ich möchte natürlich, dass das Script für alle Benutzer funktioniert und nicht nur für einen Teil

Grüße
rubberman
Bitte warten ..
Mitglied: nrt4ipok
25.02.2016 um 10:37 Uhr
Hallo rubberman,

Hier mein Code der Funktion GetRelFolder:
01.
Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO) 
02.
  Dim objFolder, strRel, strThisFolder, strSelectedFolder, iDiff 
03.
  strRel = "" 
04.
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName) 
05.
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _ 
06.
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder) 
07.
  If Not objFolder Is Nothing Then 
08.
    strSelectedFolder = objFolder.Self.Path 
09.
    If InStr(1, strSelectedFolder, strThisFolder, vbTextCompare) = 1 Then 
10.
      iDiff = Len(strSelectedFolder) - Len(strThisFolder) 
11.
		If iDiff > 0 Then 
12.
        strRel = Right(strSelectedFolder, iDiff - 1) 
13.
 
14.
MsgBox( _ 
15.
	"strSelectedFolder(" & Len(strSelectedFolder) &")=" & strSelectedFolder & vbCrLf & _ 
16.
	"strThisFolder(" & Len(strThisFolder) &")=" & strThisFolder & vbCrLf & _ 
17.
	"iDiff=" & iDiff & vbCrLf & _ 
18.
	"strRel=" & Right(strSelectedFolder, iDiff - 1) ) 
19.
 
20.
        If Not oFSO.FolderExists(strRel) Then strRel = "" 
21.
      End If 
22.
    End If 
23.
    Set objFolder = Nothing 
24.
  End If 
25.
  GetRelFolder = strRel 
26.
End Function 
27.
Ausgabe 1:
strSelectedFolder(13)=E:\CodeBlocks
strThisFolder(3)=E:\
iDiff=10
strRel=odeBlocks
Ausgabe 2:
strSelectedFolder(32)=E:\CodeBlocksPortable\CodeBlocks
strThisFolder(21)=E:\CodeBlocksPortable
iDiff=11
strRel=CodeBlocks

Und sofort sieht man den Fehler, und zwar bei "strThisFolder" wenn das Script im Rootverzeichnis des Lauftwerks ist.
So sieht dann die Funktion "GetRelFolder" gepatcht aus:
01.
Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO) 
02.
  Dim objFolder, strRel, strThisFolder, strSelectedFolder, iDiff 
03.
  strRel = "" 
04.
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName) 
05.
  If Right(strThisFolder,1) = "\" Or Right(strThisFolder,1) = "/" Then 
06.
    strThisFolder = Left(strThisFolder,Len(strThisFolder) - 1) 
07.
  End If 
08.
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _ 
09.
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder) 
10.
  If Not objFolder Is Nothing Then 
11.
    strSelectedFolder = objFolder.Self.Path 
12.
    If InStr(1, strSelectedFolder, strThisFolder, vbTextCompare) = 1 Then 
13.
      iDiff = Len(strSelectedFolder) - Len(strThisFolder) 
14.
		If iDiff > 0 Then 
15.
        strRel = Right(strSelectedFolder, iDiff - 1) 
16.
        If Not oFSO.FolderExists(strRel) Then strRel = "" 
17.
      End If 
18.
    End If 
19.
    Set objFolder = Nothing 
20.
  End If 
21.
  GetRelFolder = strRel 
22.
End Function
Grüße
nrt4ipok
Bitte warten ..
Mitglied: rubberman
25.02.2016, aktualisiert um 19:26 Uhr
Hallo nrt4ipok.

wenn das Script im Rootverzeichnis des Lauftwerks ist
Hehe, ja genau das ist so auch nicht vorgesehen. Punkt 3 nicht gelesen, tse tse tse

Auf jeden Fall vielen Dank, dass du noch mal drüber geschaut hast. Sicherlich übernehme ich deinen Patch so oder leicht abgewandelt in das Script (nachdem ich getestet habe). Der Forward-Slash sollte sicher nicht vorkommen, da WScript.ScriptFullName einen Windows-Pfad mit Backslashes zurückgibt. Wahrscheinlich reicht es die Länge des absoluten Pfads zu prüfen. Ist sie 3, muss der Pfad auf 2 eingekürzt werden...

Danke nochmal! Diese Art von Feedback ist für mich besonders konstruktiv, denn man stolpert nicht unbedingt selbst über jeden Bug Dafür gibt's gleich mal ein Upvote von mir.

Grüße
rubberman

PS:
Nach ersten Start + mehrfache Versuche da nix kam ... musste ich feststellen das es einfach nichts angezeigt wurde.
Lösung: mit ALT + TAB die CB Compilerauswahl selektieren.

ob Dies am OS liegt kann ich nicht beurteilen da ich bis heute noch nie was mit Windows-Programmierung zutun hatte.
Mit Version 16.01 von Code::Blocks hatte ich diese Erscheinung das erste mal. Ich hatte daraufhin am 07.02.16 den Punkt 5.2. entsprechend ergänzt. Alt+Tab funktioniert natürlich alternativ zur Minimierung überdeckender Fenster. Mit dem OS sollte das allerdings nichts zu tun haben. Hier legt C::B das Child-Fenster einfach nicht korrekt in den Vordergrund ...
Bitte warten ..
Mitglied: Friemler
26.02.2016, aktualisiert um 10:28 Uhr
Hallo zusammen,

ich hätte da noch eine etwas kürzere alternative Version:

01.
Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO) 
02.
  Dim objFolder, strRel, strThisFolder, strSelectedFolder, iDiff 
03.
 
04.
  strRel        = "" 
05.
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName) 
06.
 
07.
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _ 
08.
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder) 
09.
 
10.
  If Not objFolder Is Nothing Then 
11.
    strSelectedFolder = objFolder.Self.Path 
12.
 
13.
    If Left(strSelectedFolder, Len(strThisFolder)) = strThisFolder Then 
14.
      iDiff  = Len(strSelectedFolder) - Len(Trim(oFSO.BuildPath(strThisFolder, " "))) 
15.
      strRel = Right(strSelectedFolder, iDiff) 
16.
      If Not oFSO.FolderExists(strRel) Then strRel = "" 
17.
    End If 
18.
 
19.
    Set objFolder = Nothing 
20.
  End If 
21.
 
22.
  GetRelFolder = strRel 
23.
End Function

Grüße
Friemler
Bitte warten ..
Mitglied: nrt4ipok
26.02.2016 um 11:01 Uhr
Danke rubberman,
und sorry das ich eigendlich bei der Anleitung nur drüberflog. Dass mit Forward-Slash ist eine Linux Gewohnheit bei Path's.

Ein produktiven Feedback geb ich immer gern für eine gute Sache immerhin hast dir viel Muhe gemacht, DANKE dafür!


Danke Friemler,
dein Code funktioniert perfekt
... gleich in Ablage für CodeSchnipses hinterlegt
01.
Trim(oFSO.BuildPath(strFolder, " "))
Grüße
nrt4ipok
Bitte warten ..
Mitglied: rubberman
26.02.2016 um 18:38 Uhr
Danke Leute!

Ich werde mir das gesamte Script am Wochenende nochmal zu Gemüte führen. Vielleicht kann ich noch etwas optimieren. Bei Scriptsprachen ist das mehr oder weniger eine Sache von "Trial and Error". Ein bisschen kann man vorausahnen. Bspw. wenn mehrfach die Länge desselben Strings festgestellt werden soll, wird ggf. auch mehrfach über den gesamten String iteriert um die Zeichen zu zählen. Bei Veränderungen am String könnten Speicherallokationen und Kopiervorgänge nötig werden, die Ressourcen fressen. Kürzerer Code muss dann also nicht zwangsläufig eine bessere Performance bedeuten. Trotzdem danke @Friemler, mal sehen was sich aus deinem Vorschlag übernehmen lässt

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
27.02.2016, aktualisiert um 07:38 Uhr
Moin rubberman!

Zitat von rubberman:

Kürzerer Code muss dann also nicht zwangsläufig eine bessere Performance bedeuten.

Da hast Du vollkommen Recht. Ich hatte in meinem Posting auch das falsche Adjektiv gewählt: "übersichtlicher" wäre die bessere Wahl gewesen, um meine dahinter steckende Motivation zu beschreiben. Ich finde das Herumgerechne mit String-Indizes meist schwer verständlich.

Ob allerdings im hiesigen konkreten Anwendungsfall von GetRelFolder Überlegungen zur Performance überhaupt notwendig sind, darüber ließe sich schon diskutieren...

Gruß
Friemler
Bitte warten ..
Mitglied: rubberman
27.02.2016, aktualisiert um 12:42 Uhr
Hallo Friemler.

"übersichtlicher"
Naja, den Pfad um einen Verzeichnisname bestehend aus einem Leerzeichen zu erweitern, das in derselben Funktionsverschachtelung wieder entfernt wird, könnte bei dem einen oder anderen auch eine Weile brauchen, bis angekommen ist, was der Sinn der Aktion sein könnte Aber grundsätzlich ist es schon so, dass die Lesbarkeit schwerer wird, wenn der Code in den Funktionen zu lang wird.
Da sich das Tut aber eher an C und C++ Entwickler richtet, vermute ich sowieso bei den meisten Benutzern eine Reaktion à la "VBS? WTF? Egal, Hauptsache ist, es funktioniert."

Ob allerdings im hiesigen konkreten Anwendungsfall von GetRelFolder Überlegungen zur Performance überhaupt notwendig sind, darüber ließe sich schon diskutieren...
Nein, darüber muss man nicht viel diskutieren. Dieser Teil des Scripts wird i.d.R. nur einmalig (öhm ... dreimalig) benötigt und da dort Benutzerinteraktion stattfindet, ist die Frage nach Performance hinfällig. Da gehe ich völlig d'accord.

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Windows Server

Teamviewer-IDs von angemeldeten Benutzern auslesen

(1)

Tipp von BirdyB zum Thema Windows Server ...

Heiß diskutierte Inhalte
Netzwerkgrundlagen
Fritzbox 7490 von aussen nicht anpingbar? (20)

Frage von aif-get zum Thema Netzwerkgrundlagen ...

Weiterbildung
Ausbildung fertig, was nun ? (16)

Frage von Meterpeter zum Thema Weiterbildung ...

Server-Hardware
IBM x3250 M4 - Plötzlicher Shutdown (12)

Frage von xet9fi2 zum Thema Server-Hardware ...

Windows 7
Erfahrungen mit "Offlinedateien" - oder eine Alternative? (11)

Frage von FreakInCake zum Thema Windows 7 ...