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 09.09.2016, 12712 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 (sourceforge.net/projects/mingw-w64-dgn/files/mingw-w64/).
Suche dort die Downloads
"mingw-w64-bin-x86_64-YYYYMMDD.7z"
und
"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 GetLastVersion 
15.
  Const sURL = "https://sourceforge.net/projects/mingw-w64-dgn/files/mingw-w64/", _ 
16.
        sFilePattern = "mingw-w64-bin-x86_64-20\d{6}\.7z" 
17.
  Dim objXMLHTTP, strHTML, objRegex, sVer 
18.
  sVer = "" 
19.
  On Error Resume Next 
20.
  Set objXMLHTTP = CreateObject("Microsoft.XMLHTTP") 
21.
  objXMLHTTP.open "GET", sURL, False 
22.
  objXMLHTTP.setRequestHeader "Cache-Control", "private, no-cache, no-store, must-revalidate" 
23.
  objXMLHTTP.setRequestHeader "Pragma", "no-cache" 
24.
  objXMLHTTP.send 
25.
  If (objXMLHTTP.readyState = 4 And objXMLHTTP.status = 200) Then 
26.
    strHTML = objXMLHTTP.responseText 
27.
    Set objRegex = New RegExp 
28.
    objRegex.Global = False 
29.
    objRegex.IgnoreCase = False 
30.
    objRegex.Pattern = "<tr\s+title=""" & sFilePattern & """" 
31.
    If objRegex.Test(strHTML) Then 
32.
      sVer = objRegex.Execute(strHTML)(0) 
33.
      objRegex.Pattern = "\d{8}" 
34.
      sVer = objRegex.Execute(sVer)(0) 
35.
    End If 
36.
  End If 
37.
  On Error Goto 0 
38.
  GetLastVersion = sVer 
39.
End Function 
40.
 
41.
Function GetOSArchitecture() 
42.
  Dim objWMI, colOS, objOS 
43.
  GetOSArchitecture = "32" 
44.
  Set objWMI = GetObject("winmgmts:\\.\root\CIMV2") 
45.
  Set colOS = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem WHERE NumberOfProcesses > 0", _ 
46.
    "WQL", wbemFlagReturnImmediately Or wbemFlagForwardOnly) 
47.
  For Each objOS In colOS 
48.
    On Error Resume Next 
49.
    If InStr(1, objOS.CreationClassName, "64", vbTextCompare) > 0 Then GetOSArchitecture = "64" 
50.
    If InStr(1, objOS.OSArchitecture, "64", vbTextCompare) > 0 Then GetOSArchitecture = "64" 
51.
    On Error Goto 0 
52.
  Next 
53.
End Function 
54.
 
55.
Function GetRelFolder(ByRef strMsg, ByRef iStyle, ByRef oFSO) 
56.
  Dim objFolder, strThisFolder, strSelectedFolder, iDiff, iThisFolder 
57.
  GetRelFolder = "" 
58.
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName) 
59.
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _ 
60.
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder) 
61.
  If Not objFolder Is Nothing Then 
62.
    strSelectedFolder = objFolder.Self.Path 
63.
    iThisFolder = Len(strThisFolder) 
64.
    If Left(strSelectedFolder, iThisFolder) = strThisFolder Then 
65.
      If iThisFolder = 3 Then iThisFolder = 2 
66.
      iDiff = Len(strSelectedFolder) - iThisFolder 
67.
      GetRelFolder = Right(strSelectedFolder, iDiff - 1) 
68.
      If Not oFSO.FolderExists(GetRelFolder) Then GetRelFolder = "" 
69.
    End If 
70.
  End If 
71.
End Function 
72.
 
73.
Sub GetAllProjects(ByRef oFolder, ByRef oADOR, ByRef oFSO) 
74.
  Dim oFile, oSubfolder, sFilePath 
75.
  For Each oFile In oFolder.Files 
76.
    sFilePath = oFile.Path 
77.
    If LCase(oFSO.GetExtensionName(sFilePath)) = "layout" Then 
78.
      oADOR.AddNew Array("vcPath", "vnDateLastMod"), Array(Mid(sFilePath, 1, Len(sFilePath) - 6) & "cbp", _ 
79.
        CDbl(DateDiff("s", CDate(0), oFile.DateLastModified))) 
80.
    End If 
81.
  Next 
82.
  For Each oSubfolder In oFolder.SubFolders 
83.
    If oSubfolder.Name <> "_archive_" Then GetAllProjects oSubfolder, oADOR, oFSO 
84.
  Next 
85.
End Sub 
86.
 
87.
Sub CreateXMLFile(ByRef p1, ByRef p2, ByRef p3, ByRef cu, ByRef oFSO) 
88.
  With oFSO.CreateTextFile(sConfigXML) 
89.
    .Write "<?xml version=""1.0"" encoding=""Windows-1252"" standalone=""yes""?>" & vbCrLf & _ 
90.
      "<!-- Einstellungen für CB-Portable-Launcher -->" & vbCrLf & _ 
91.
      "<CB_Portable_Launcher_Config version=""1"">" & vbCrLf & _ 
92.
      vbTab & "<relative_pathes description=""Die path-Attribute geben die relativen Pfade an."">" & vbCrLf & _ 
93.
      vbTab & vbTab & "<CBDir path=""" & p1 & """ description=""Pfad zum CodeBlocks - Rootverzeichnis, RELATIV zum Script"" />" & vbCrLf & _ 
94.
      vbTab & vbTab & "<ProjDir path=""" & p2 & """ description=""Pfad zum Projects - Rootverzeichnis, RELATIV zum Script"" />" & vbCrLf & _ 
95.
      vbTab & vbTab & "<AdditionalIncludeDir path=""" & p3 & """ description=""Pfad zum Additional_Include - Rootverzeichnis, RELATIV zum Script"" />" & vbCrLf & _ 
96.
      vbTab & "</relative_pathes>" & vbCrLf & _ 
97.
      vbTab & "<search_compiler_update check=""" & cu & """ description=""Versionsdatum des Compilers verifizieren, 0=nein, 1=ja"" />" & vbCrLf & _ 
98.
      "</CB_Portable_Launcher_Config>" 
99.
    .Close 
100.
  End With 
101.
End Sub 
102.
 
103.
Sub CreateConfFile(ByRef sConfFile) 
104.
  ' ggf. "default.conf" mit Voreinstellungen anlegen 
105.
  Dim oADOTxtS 
106.
  Set oADOTxtS = CreateObject("ADODB.Stream") 
107.
  With oADOTxtS 
108.
    .Type = adTypeText 
109.
    .Mode = adModeReadWrite 
110.
    .Charset = "UTF-8" 
111.
    .Open 
112.
    .WriteText "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>" & _ 
113.
      "<CodeBlocksConfig version=""1""><app>" & _ 
114.
      "<environment><CHECK_ASSOCIATIONS bool=""0"" /></environment>" & _ 
115.
      "<SHOW_TIPS bool=""0"" /><RECENT_PROJECTS><astr /></RECENT_PROJECTS>" & _ 
116.
      "<locale><ENABLE bool=""1"" /></locale></app>" & _ 
117.
      "<project_manager><DEFAULT_PATH><str /></DEFAULT_PATH></project_manager>" & _ 
118.
      "<compiler><build_progress />" & _ 
119.
      "<SETTINGS_VERSION><str><![CDATA[0.0.3]]></str></SETTINGS_VERSION>" & _ 
120.
      "<sets><gcc><NAME><str><![CDATA[GNU GCC Compiler]]></str></NAME>" & _ 
121.
      "<LINKER_OPTIONS><str><![CDATA[-static-libgcc;-static-libstdc++;]]></str></LINKER_OPTIONS>" & _ 
122.
      "<MASTER_PATH><str /></MASTER_PATH>" & _ 
123.
      "<C_COMPILER><str><![CDATA[gcc.exe]]></str></C_COMPILER>" & _ 
124.
      "<CPP_COMPILER><str><![CDATA[g++.exe]]></str></CPP_COMPILER>" & _ 
125.
      "<LINKER><str><![CDATA[g++.exe]]></str></LINKER>" & _ 
126.
      "<MAKE><str><![CDATA[make.exe]]></str></MAKE></gcc></sets>" & _ 
127.
      "<DEFAULT_COMPILER><str><![CDATA[gcc]]></str></DEFAULT_COMPILER>" & _ 
128.
      "</compiler><debugger_common><sets><gdb_debugger><conf1>" & _ 
129.
      "<NAME><str><![CDATA[Default]]></str></NAME>" & _ 
130.
      "<values><EXECUTABLE_PATH><str /></EXECUTABLE_PATH></values>" & _ 
131.
      "</conf1></gdb_debugger></sets></debugger_common></CodeBlocksConfig>" 
132.
    .Position = 0 
133.
    .SaveToFile sConfFile, adSaveCreateOverWrite 
134.
    .Close 
135.
  End With 
136.
End Sub 
137.
 
138.
Sub ChangeConf(ByRef sConfFile, ByRef sProjDir, ByRef sAIncludeDir, ByRef sMinGWDir, ByRef oADOR, ByRef oFSO) 
139.
  Dim oXmlDoc, oNode, oNodeItem, i 
140.
  Set oXmlDoc = CreateObject("Microsoft.XMLDOM") 
141.
  oXmlDoc.async = False 
142.
  oXmlDoc.validateOnParse = False 
143.
  oXmlDoc.resolveExternals = False 
144.
  oXmlDoc.load(sConfFile) 
145.
  If oXmlDoc.parseError.errorCode = 0 Then 
146.
    ' Pfad zu MinGW anpassen 
147.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/MASTER_PATH/str") 
148.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
149.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
150.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/MASTER_PATH") 
151.
    oNode.appendChild oNodeItem 
152.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/MASTER_PATH/str") 
153.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir) 
154.
    oNode.appendChild oNodeItem 
155.
    ' Pfad zu Debugger anpassen 
156.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH/str") 
157.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
158.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
159.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH") 
160.
    oNode.appendChild oNodeItem 
161.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH/str") 
162.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir & "\bin\gdb.exe") 
163.
    oNode.appendChild oNodeItem 
164.
    ' Default Projektpfad anpassen 
165.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//project_manager/DEFAULT_PATH/str") 
166.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
167.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
168.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//project_manager/DEFAULT_PATH") 
169.
    oNode.appendChild oNodeItem 
170.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//project_manager/DEFAULT_PATH/str") 
171.
    Set oNodeItem = oXmlDoc.createCDATASection(sProjDir & "\") 
172.
    oNode.appendChild oNodeItem 
173.
    ' Pfad zu Includes anpassen 
174.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/INCLUDE_DIRS") 
175.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
176.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc") 
177.
    Set oNodeItem = oXmlDoc.createElement("INCLUDE_DIRS") 
178.
    oNode.appendChild oNodeItem 
179.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/INCLUDE_DIRS") 
180.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
181.
    oNode.appendChild oNodeItem 
182.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/INCLUDE_DIRS/str") 
183.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir & "\mingw\include;" & sAIncludeDir & ";") 
184.
    oNode.appendChild oNodeItem 
185.
    ' Pfad zu Libraries anpassen 
186.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/LIBRARY_DIRS") 
187.
    If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
188.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc") 
189.
    Set oNodeItem = oXmlDoc.createElement("LIBRARY_DIRS") 
190.
    oNode.appendChild oNodeItem 
191.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/LIBRARY_DIRS") 
192.
    Set oNodeItem = oXmlDoc.createNode(1, "str", "") 
193.
    oNode.appendChild oNodeItem 
194.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//compiler/sets/gcc/LIBRARY_DIRS/str") 
195.
    Set oNodeItem = oXmlDoc.createCDATASection(sMinGWDir & "\mingw\lib;") 
196.
    oNode.appendChild oNodeItem 
197.
    ' Projects zu RECENT_PROJECTS hinzufügen 
198.
    If oADOR.RecordCount > 0 Then 
199.
      i = 0 
200.
      Set oNode = oXmlDoc.documentElement.selectSingleNode("//app/RECENT_PROJECTS/astr") 
201.
      If Not oNode Is Nothing Then oNode.parentNode.removeChild(oNode) 
202.
      Set oNodeItem = oXmlDoc.createNode(1, "astr", "") 
203.
      Set oNode = oXmlDoc.documentElement.selectSingleNode("//app/RECENT_PROJECTS") 
204.
      oNode.appendChild oNodeItem 
205.
      Set oNode = oXmlDoc.documentElement.selectSingleNode("//app/RECENT_PROJECTS/astr") 
206.
      While Not oADOR.EOF And i < 20 
207.
        If oFSO.FileExists(oADOR("vcPath")) Then 
208.
          Set oNodeItem = oXmlDoc.createNode(1, "s", "") 
209.
          oNode.appendChild oNodeItem 
210.
          Set oNodeItem = oXmlDoc.createCDATASection(oADOR("vcPath")) 
211.
          oNode.childNodes(i).appendChild oNodeItem 
212.
          i = i + 1 
213.
        End If 
214.
        oADOR.MoveNext 
215.
      Wend 
216.
    End If 
217.
    oXmlDoc.save(sConfFile) 
218.
  Else 
219.
    MsgBox oXmlDoc.parseError.reason & vbLf & _ 
220.
      "Der Pfad zu MinGW konnte in Datei" & vbLf & """" & sConfFile & """" & _ 
221.
      vbLf & "nicht angepasst werden." & vbLf & _ 
222.
      "Voraussichtlich kann Code::Blocks den Compiler nicht aufrufen.", _ 
223.
      vbExclamation Or vbSystemModal, "Fehler" 
224.
  End If 
225.
End Sub 
226.
 
227.
Sub main() 
228.
  Dim CBDir, ProjDir, AdditionalIncludeDir, _ 
229.
    oFSO, oWSH, oADOR, oXmlDoc, oNode, oProjDir, _ 
230.
    sCBDir, sProjDir, sConfFile, sAIncludeDir, sMinGWDir, sAppdataDir, sOS, _ 
231.
    arrPath, i, CompilerUpdate 
232.
 
233.
  Set oFSO = CreateObject("Scripting.FileSystemObject") 
234.
  Set oWSH = CreateObject("WScript.Shell") 
235.
  Set oADOR = CreateObject("ADODB.Recordset") 
236.
  ' sicherstellen, dass das Ausgangsarbeitsverzeichnis dem Scriptverzeichnis entspricht 
237.
  oWSH.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName) 
238.
  ' ggf. xml erzeugen 
239.
  If Not oFSO.FileExists(sConfigXML) Then 
240.
    Do 
241.
      If MsgBox("Wählen Sie nachfolgend das Verzeichnis aus, " & _ 
242.
        "in dem ""codeblocks.exe"" zu finden ist." & vbLf & _ 
243.
        "Dieser Schritt wird wiederholt, wenn ""codeblocks.exe"" nicht " & _ 
244.
        "in einem Unterverzeichnis relativ zu diesem Script liegt.", _ 
245.
        vbOKCancel Or vbInformation Or vbSystemModal, "Code::Blocks - Verzeichnis") _ 
246.
        = vbCancel Then WScript.Quit 
247.
      CBDir = GetRelFolder("Code::Blocks", BIF_RETURNONLYFSDIRS Or BIF_NONEWFOLDERBUTTON, oFSO) 
248.
    Loop While CBDir = "" 
249.
    Do 
250.
      If MsgBox("Wählen Sie nachfolgend das Verzeichnis aus, " & _ 
251.
        "in dem Ihre Projekte gespeichert werden." & vbLf & _ 
252.
        "Dieser Schritt wird wiederholt, wenn es sich nicht " & _ 
253.
        "um ein Unterverzeichnis relativ zu diesem Script handelt.", _ 
254.
        vbOKCancel Or vbInformation Or vbSystemModal, "Projects - Verzeichnis") _ 
255.
        = vbCancel Then WScript.Quit 
256.
      ProjDir = GetRelFolder("Projects", BIF_RETURNONLYFSDIRS, oFSO) 
257.
    Loop While ProjDir = "" 
258.
    Do 
259.
      If MsgBox("Wählen Sie nachfolgend das Verzeichnis aus, " & _ 
260.
        "in dem Sie weitere Dateien ablegen können, die Sie in Ihre Codes einbeziehen wollen." & vbLf & _ 
261.
        "Dieser Schritt wird wiederholt, wenn es sich nicht " & _ 
262.
        "um ein Unterverzeichnis relativ zu diesem Script handelt.", _ 
263.
        vbOKCancel Or vbInformation Or vbSystemModal, "Additional_Include - Verzeichnis") _ 
264.
        = vbCancel Then WScript.Quit 
265.
      AdditionalIncludeDir = GetRelFolder("Additional_Include", BIF_RETURNONLYFSDIRS, oFSO) 
266.
    Loop While AdditionalIncludeDir = "" 
267.
    CompilerUpdate = MsgBox("Möchten Sie, dass bei jedem Start überprüft wird, " & _ 
268.
      "ob eine neue Version des Compilers verfügbar ist?" & vbLf & _ 
269.
      "(Zu diesem Zweck werden Informationen aus dem Internet angefordert.)", _ 
270.
      vbYesNoCancel Or vbQuestion Or vbSystemModal, "Versionsüberprüfung Compiler") 
271.
    If CompilerUpdate = vbCancel Then 
272.
      WScript.Quit 
273.
    ElseIf CompilerUpdate = vbYes Then 
274.
      CompilerUpdate = 1 
275.
    Else 
276.
      CompilerUpdate = 0 
277.
    End If 
278.
    CreateXMLFile CBDir, ProjDir, AdditionalIncludeDir, CStr(CompilerUpdate), oFSO 
279.
    MsgBox "Ihre Einstellungen wurden in """ & sConfigXML & _ 
280.
      """ abgelegt und können nachträglich in den ""path""- bzw. ""check""-Attributen geändert werden.", _ 
281.
      vbInformation Or vbSystemModal, sConfigXML 
282.
  End If 
283.
  ' Einstellungen aus xml lesen 
284.
  Set oXmlDoc = CreateObject("Microsoft.XMLDOM") 
285.
  oXmlDoc.async = False 
286.
  oXmlDoc.load(sConfigXML) 
287.
  If oXmlDoc.parseError.errorCode = 0 Then 
288.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//relative_pathes/CBDir") 
289.
    CBDir = oNode.getAttribute("path") 
290.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//relative_pathes/ProjDir") 
291.
    ProjDir = oNode.getAttribute("path") 
292.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//relative_pathes/AdditionalIncludeDir") 
293.
    AdditionalIncludeDir = oNode.getAttribute("path") 
294.
    Set oNode = oXmlDoc.documentElement.selectSingleNode("//search_compiler_update") 
295.
    CompilerUpdate = CInt(oNode.getAttribute("check")) 
296.
  Else 
297.
    MsgBox "Fehler in Datei """ & sConfigXML & """" & vbLf & oXmlDoc.parseError.reason, _ 
298.
      vbCritical Or vbSystemModal, "Fehler" 
299.
    WScript.Quit 
300.
  End If 
301.
  ' Projects Verzeichnis 
302.
  ProjDir = Trim(Replace(ProjDir, "/", "\")) 
303.
  If Not oFSO.FolderExists(ProjDir) Then 
304.
    arrPath = Split(ProjDir, "\") 
305.
    If (arrPath(0) = "" Or InStr(1, arrPath(0), ":", vbTextCompare) > 0) Then 
306.
      MsgBox "Der Pfad" & vbLf & """" & ProjDir & """" & _ 
307.
        vbLf & "ist nicht relativ zum Script auflösbar." & vbLf & _ 
308.
        "Ändern Sie den Pfad in " & sConfigXML & " entsprechend.", _ 
309.
        vbExclamation Or vbSystemModal, "Fehler" 
310.
      WScript.Quit 
311.
    Else 
312.
      ProjDir = "" 
313.
      For i = 0 To UBound(arrPath) 
314.
        If arrPath(i) = "" Then Exit For 
315.
        ProjDir = ProjDir & arrPath(i) 
316.
        If Not oFSO.FolderExists(ProjDir) Then oFSO.CreateFolder(ProjDir) 
317.
        ProjDir = ProjDir & "\" 
318.
      Next 
319.
    End If 
320.
  End If 
321.
  sProjDir = oFSO.BuildPath(oWSH.CurrentDirectory, ProjDir) ' absoluter Pfad 
322.
  Set oProjDir = oFSO.GetFolder(sProjDir) 
323.
  sProjDir = oProjDir.Path 
324.
  ' Additional_Include Verzeichnis 
325.
  AdditionalIncludeDir = Trim(Replace(AdditionalIncludeDir, "/", "\")) 
326.
  If Not oFSO.FolderExists(AdditionalIncludeDir) Then 
327.
    arrPath = Split(AdditionalIncludeDir, "\") 
328.
    If (arrPath(0) = "" Or InStr(1, arrPath(0), ":", vbTextCompare) > 0) Then 
329.
      MsgBox "Der Pfad" & vbLf & """" & AdditionalIncludeDir & """" & _ 
330.
        vbLf & "ist nicht relativ zum Script auflösbar." & vbLf & _ 
331.
        "Ändern Sie den Pfad in " & sConfigXML & " entsprechend.", _ 
332.
        vbExclamation Or vbSystemModal, "Fehler" 
333.
      WScript.Quit 
334.
    Else 
335.
      AdditionalIncludeDir = "" 
336.
      For i = 0 To UBound(arrPath) 
337.
        If arrPath(i) = "" Then Exit For 
338.
        AdditionalIncludeDir = AdditionalIncludeDir & arrPath(i) 
339.
        If Not oFSO.FolderExists(AdditionalIncludeDir) Then oFSO.CreateFolder(AdditionalIncludeDir) 
340.
        AdditionalIncludeDir = AdditionalIncludeDir & "\" 
341.
      Next 
342.
    End If 
343.
  End If 
344.
  sAIncludeDir = oFSO.BuildPath(oWSH.CurrentDirectory, AdditionalIncludeDir) ' absoluter Pfad 
345.
  sAIncludeDir = oFSO.GetFolder(sAIncludeDir).Path 
346.
  ' in CodeBlocks - Rootverzeichnis wechseln 
347.
  CBDir = Trim(Replace(CBDir, "/", "\")) 
348.
  If Not oFSO.FolderExists(CBDir) Then 
349.
    MsgBox "Der Pfad" & vbLf & """" & CBDir & """" & _ 
350.
      vbLf & "existiert nicht." & vbLf & _ 
351.
      "Ändern Sie den Pfad in " & sConfigXML & " entsprechend.", _ 
352.
      vbExclamation Or vbSystemModal, "Fehler" 
353.
    WScript.Quit 
354.
  End If 
355.
  oWSH.CurrentDirectory = CBDir 
356.
  ' Compilerversion überprüfen 
357.
  If CompilerUpdate = 1 Then 
358.
    Const sURL = "https://www.administrator.de/wissen/codeblocks-portable-mingw-32-64-bit-windows-202510.html#toc-20", _ 
359.
          sCompiler = "mingw64\bin\gcc.exe" 
360.
    Dim dCompDate 
361.
    If oFSO.FileExists(sCompiler) Then 
362.
      dCompDate = oFSO.GetFile(sCompiler).DateCreated 
363.
      If GetLastVersion > Year(dCompDate) & Right("0" & Month(dCompDate), 2) & Right("0" & Day(dCompDate), 2) Then 
364.
        If MsgBox("Es liegt eine neue Version des Compilers vor. Besuchen Sie" & vbLF & sURL & vbLF & _ 
365.
            "und lesen Sie, wie Sie den Compiler updaten können." & vbLF & vbLF & _ 
366.
            "Möchten Sie die Seite jetzt öffnen?", _ 
367.
            vbYesNo Or vbInformation Or vbDefaultButton2 Or vbSystemModal, "Neue Compilerversion") = vbYes Then 
368.
          oWSH.Run sURL 
369.
        End If 
370.
      End If 
371.
    End If 
372.
  End If 
373.
  ' Prüfen ob codeblocks.exe existiert 
374.
  If Not oFSO.FileExists("codeblocks.exe") Then 
375.
    MsgBox """codeblocks.exe"" konnte nicht gefunden werden." & vbLf & _ 
376.
      "Prüfen Sie den Pfad in """ & sConfigXML & """.", _ 
377.
      vbCritical Or vbSystemModal, "Fehler" 
378.
    WScript.Quit 
379.
  End If 
380.
  ' Projects Dateien suchen und absteigend nach Datum sortieren (basierend auf *.layout Dateien) 
381.
  oADOR.Fields.Append "vcPath", adVarChar, 255 
382.
  oADOR.Fields.Append "vnDateLastMod", adVarNumeric, 8 
383.
  oADOR.Open 
384.
  GetAllProjects oProjDir, oADOR, oFSO 
385.
  If oADOR.RecordCount > 0 Then oADOR.Sort = "vnDateLastMod DESC" 
386.
  ' OS Architektur / Abfrage 
387.
  sOS = GetOSArchitecture 
388.
  If sOS = "64" Then 
389.
    If MsgBox("Sollen 64-Bit-Anwendungen erstellt werden?", _ 
390.
      vbYesNo Or vbQuestion Or vbSystemModal, "Windows x64 detektiert.") _ 
391.
      = vbNo Then sOS = "32" 
392.
  End If 
393.
  ' Pfade 
394.
  sCBDir = oWSH.CurrentDirectory ' resultiert zum absoluten Pfad 
395.
  sConfFile = oFSO.BuildPath(sCBDir, "AppData\codeblocks\default.conf") 
396.
  sMinGWDir = oFSO.BuildPath(sCBDir, "mingw" & sOS) 
397.
  sAppdataDir = oFSO.BuildPath(sCBDir, "AppData") 
398.
  ' Konfiguration anpassen 
399.
  If Not oFSO.FileExists(sConfFile) Then 
400.
    If Not oFSO.FolderExists(sAppdataDir) Then oFSO.CreateFolder(sAppdataDir) 
401.
    If Not oFSO.FolderExists(sAppdataDir & "\codeblocks") Then oFSO.CreateFolder(sAppdataDir & "\codeblocks") 
402.
    CreateConfFile sConfFile 
403.
  End If 
404.
  ChangeConf sConfFile, sProjDir, sAIncludeDir, sMinGWDir, oADOR, oFSO 
405.
  oADOR.Close 
406.
  ' APPDATA in der Prozessumgebung ändern 
407.
  oWSH.Environment("PROCESS")("APPDATA") = sAppdataDir 
408.
  ' Code::Blocks starten 
409.
  oWSH.Run "codeblocks.exe" 
410.
  WScript.Sleep 1500 
411.
End Sub 
412.
 
413.
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".
Im letzten Popup wirst du gefragt, ob überprüft werden soll, ob eine neue Version des Compilers verfügbar ist. Bestätigst du mit Ja, wird bei jedem Start des Scripts das Erstellungsdatum der gcc.exe im mingw64 Verzeichnis, mit dem Datum im Dateiname der letzten *.7z Datei auf sourceforge.net verglichen. Sollte eine neue Version verfügbar sein, wirst du mit einem Popup darüber informiert. Für weitere Informationen, siehe unten im Punkt "Wie kann ich den Compiler auf aktuellem Stand halten?".

Code::Blocks öffnet sich nun 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 (oder navigiere bei gehaltener [Alt] Taste mit [Tab] durch die Fenster) ...
(Diese Prozedur gibt es wirklich nur beim ersten Start.)

Geschafft! Nun kannst du endlich loslegen ...


6. Weitere Informationen

6.1. 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".

6.2. 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.

6.3. 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.

6.4. 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.

6.5. 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.

6.6. Wie kann ich den Compiler auf aktuellem Stand halten?

Eine automatische Updatefunktion ist mit VBScript kaum machbar. Du kannst aber ab und zu auf sourceforge.net 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.
Wenn du automatisch darüber informiert werden willst wenn eine neue Compilerversion verfügbar ist, ändere in der "CB-Portable-Config.xml" im Knoten search_compiler_update auf check="1" .

Änderungen:
  • 09.09.2016 Text: drangon.org scheint down zu sein, Verweis entfernt
  • 08.08.2016 Text: Punkt 5.2. und 6.6. bzgl. Scriptänderung aktualisiert.
  • 08.08.2016 Script: Optionale Überprüfung der Compilerversion hinzugefügt.
  • 06.08.2016 Text: Punkt 4.2. Alternativdownload hinzugefügt
  • 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
Server-Hardware

Welchen Serverschrank brauche ich? - Hier ein kleine Entscheidungshilfe

(3)

Anleitung von serverschrank24 zum Thema Server-Hardware ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Hardware
gelöst Patch-Kabel Beratung (18)

Frage von danaDT zum Thema Hardware ...

Windows 10
Blue Screen bei Gamestart (17)

Frage von Spectre zum Thema Windows 10 ...

Exchange Server
Shared Namespace und Standortwechsel eines Benutzers (17)

Frage von Hampek zum Thema Exchange Server ...

Router & Routing
ASUS RT-AC68 Router Firewall Fehlfunktion? (16)

Frage von pk-911 zum Thema Router & Routing ...