rubberman
Goto Top

(obsolet) CodeBlocks Portable mit MinGW 32 und 64 Bit unter Windows

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.



!!!ACHTUNG!!! Diese Anleitung ist veraltet und wird dort fortgeführt: CodeBlocks Portable mit MinGW 32 und 64 Bit unter Windows



back-to-top1. 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
Steffen

back-to-top2. Voraussetzungen

back-to-top2.1. Systemvoraussetzungen
  • Windows Betriebssystem (bislang getestet unter XP x86, sowie Win7 x86, Win7 x64, Win10 x64 und Win11 x64)
  • > 1,4 GB Speicherplatz (Stand April 2023)

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

back-to-top3. 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.

back-to-top4. Installationen

back-to-top4.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-20.03-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.)

back-to-top4.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-VV-gcc-VV-win64-YYYYMMDD.7z"
und
"mingw-w32-VV-gcc-VV-win32-YYYYMMDD.7z".
Die VV stehen dabei für die MinGW bzw. gcc versionen, YYYYMMDD ist 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

back-to-top4.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).
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.

back-to-top5. CB-Portable-Launcher.vbs

back-to-top5.1. Das Script
Mit dem folgenden VBScript wird "codeblocks.exe" mit den entsprechenden Voreinstellungen gestartet. Somit wird "Code::Blocks" zu "Code::Blocks Portable" face-wink
Das Script unter dem Name "CB-Portable-Launcher.vbs" im "CodeBlocksPortable" Verzeichnis speichern.
Option Explicit
Const prtblConf = "CB-Portable-Config.xml", adVarChar = 200, adDate = 7, BIF_RETURNONLYFSDIRS = &h1, BIF_NONEWFOLDERBUTTON = &h200  
Dim oFSO, oWSH, oSH, oRS, oXML, arrFields
Set oFSO = CreateObject("Scripting.FileSystemObject")  
Set oWSH = CreateObject("WScript.Shell")  
Set oSH = CreateObject("Shell.Application")  
Set oRS = CreateObject("ADODB.Recordset")  
Set oXML = CreateObject("Microsoft.XMLDOM")  
oXML.async = False
oXML.validateOnParse = False
oXML.resolveExternals = False
arrFields = Array("path", "lastMod")  
Main

Function GetLastVer()
  Dim oReq, html, oRx
  GetLastVer = ""  
  On Error Resume Next
  Set oReq = CreateObject("Microsoft.XMLHTTP")  
  oReq.open "GET", "https://sourceforge.net/projects/mingw-w64-dgn/files/mingw-w64/", False  
  oReq.setRequestHeader "Cache-Control", "no-cache, no-store"  
  oReq.send
  If oReq.readyState <> 4 Or oReq.status <> 200 Then Exit Function
  html = oReq.responseText
  Set oRx = New RegExp
  oRx.Pattern = "<tr\s+title=""mingw-w64-\d+-gcc-\d+-win64-(20\d{6})\.7z"""  
  If Not oRx.Test(html) Then Exit Function
  GetLastVer = oRx.Execute(html)(0).SubMatches(0)
End Function

Sub CheckVer()
  Const url = "https://administrator.de/knowledge/codeblocks-portable-mingw-32-64-bit-windows-202510.html#toc-20", gcc = "mingw64\bin\gcc.exe"  
  If Not oFSO.FileExists(gcc) Then Exit Sub
  Dim compDate : compDate = oFSO.GetFile(gcc).DateCreated
  If GetLastVer <= Year(compDate) & Right("0" & Month(compDate), 2) & Right("0" & Day(compDate), 2) Then Exit Sub  
  If MsgBox("Es liegt eine neue Version des Compilers vor. Besuchen Sie" & vbLF & url & vbLF & "und lesen Sie, wie Sie den Compiler updaten können." & vbLF & vbLF & "Möchten Sie die Seite jetzt öffnen?", vbYesNo Or vbInformation Or vbDefaultButton2 Or vbSystemModal, "Neue Compilerversion") = vbYes Then oWSH.Run url  
End Sub

Sub CheckDir(oDir, dir)
  dir = Trim(Replace(dir, "/", "\"))  
  If Not oFSO.FolderExists(dir) Then oSH.NameSpace(oWSH.CurrentDirectory).NewFolder dir
  dir = oFSO.BuildPath(oWSH.CurrentDirectory, dir)
  Set oDir = oFSO.GetFolder(dir)
  dir = oDir.Path
End Sub

Function GetOSArch()
  Dim os
  GetOSArch = "32"  
  For Each os In GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_OperatingSystem WHERE NumberOfProcesses > 0")  
    If InStr(1, os.OSArchitecture, "64", vbTextCompare) Then GetOSArch = "64"  
  Next
End Function

Sub GetAllProjs(oDir)
  Dim oFile, oSubD, path
  For Each oFile In oDir.Files
    path = oFile.Path
    If StrComp(oFSO.GetExtensionName(path), "layout", vbTextCompare) = 0 Then oRS.AddNew arrFields, Array(Left(path, Len(path) - 6) & "cbp", oFile.DateLastModified)  
  Next
  For Each oSubD In oDir.SubFolders
    If oSubD.Name <> "_archive_" Then GetAllProjs oSubD  
  Next
End Sub

Sub CreatePrtblConf(cbDir, projDir, aInclDir, updtCmplr)
  Const tail = " - Rootverzeichnis, RELATIV zum Script"" />"  
  oFSO.CreateTextFile(prtblConf).Write "<?xml version=""1.0"" encoding=""Windows-1252"" standalone=""yes""?>" & vbCrLf & "<!-- Einstellungen für CB-Portable-Launcher -->" & vbCrLf & "<CB_Portable_Launcher_Config version=""1"">" & vbCrLf & _  
    vbTab & "<relative_pathes description=""Die path-Attribute geben die relativen Pfade an."">" & vbCrLf & _  
    vbTab & vbTab & "<CBDir path=""" & cbDir & """ description=""Pfad zum CodeBlocks" & tail & vbCrLf & _  
    vbTab & vbTab & "<ProjDir path=""" & projDir & """ description=""Pfad zum Projects" & tail & vbCrLf & _  
    vbTab & vbTab & "<AdditionalIncludeDir path=""" & aInclDir & """ description=""Pfad zum Additional_Include" & tail & vbCrLf & _  
    vbTab & "</relative_pathes>" & vbCrLf & _  
    vbTab & "<search_compiler_update check=""" & updtCmplr & """ description=""Versionsdatum des Compilers verifizieren, 0=nein, 1=ja"" />" & vbCrLf & _  
    "</CB_Portable_Launcher_Config>"  
End Sub

Sub CreateConfFile(confFile)
  oFSO.CreateTextFile(confFile).Write "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?><CodeBlocksConfig version=""1""><app><environment><CHECK_ASSOCIATIONS bool=""0"" /></environment><SHOW_TIPS bool=""0"" /><RECENT_PROJECTS><astr /></RECENT_PROJECTS>" & _  
    "<locale><ENABLE bool=""1"" /></locale></app><project_manager><DEFAULT_PATH><str /></DEFAULT_PATH></project_manager><compiler><build_progress /><SETTINGS_VERSION><str><![CDATA[0.0.3]]></str></SETTINGS_VERSION>" & _  
    "<sets><gcc><NAME><str><![CDATA[GNU GCC Compiler]]></str></NAME><COMPILER_OPTIONS><str><![CDATA[-Wall;-std=c++20;-std=c17;-s;-ffunction-sections;-fdata-sections;]]></str></COMPILER_OPTIONS>" & _  
    "<LINKER_OPTIONS><str><![CDATA[-O3;-static-libstdc++;-static-libgcc;-Wl,-Bstatic -lstdc++ -lpthread;-Wl,--gc-sections;]]></str></LINKER_OPTIONS><MASTER_PATH><str /></MASTER_PATH><C_COMPILER><str><![CDATA[gcc.exe]]></str></C_COMPILER>" & _  
    "<CPP_COMPILER><str><![CDATA[g++.exe]]></str></CPP_COMPILER><LINKER><str><![CDATA[g++.exe]]></str></LINKER><MAKE><str><![CDATA[make.exe]]></str></MAKE></gcc></sets><DEFAULT_COMPILER><str><![CDATA[gcc]]></str></DEFAULT_COMPILER></compiler>" & _  
    "<debugger_common><sets><gdb_debugger><conf1><NAME><str><![CDATA[Default]]></str></NAME><values><EXECUTABLE_PATH><str /></EXECUTABLE_PATH></values></conf1></gdb_debugger></sets></debugger_common><scripts><generic_wizard><WANT_DEBUG bool=""1"" /><DEBUG_NAME><str><![CDATA[Debug]]></str></DEBUG_NAME>" & _  
    "<DEBUG_OUTPUT><str /></DEBUG_OUTPUT><DEBUG_OBJECTS_OUTPUT><str /></DEBUG_OBJECTS_OUTPUT><WANT_RELEASE bool=""1"" /><RELEASE_NAME><str><![CDATA[Release]]></str></RELEASE_NAME><RELEASE_OUTPUT><str /></RELEASE_OUTPUT><RELEASE_OBJECTS_OUTPUT><str /></RELEASE_OBJECTS_OUTPUT></generic_wizard></scripts></CodeBlocksConfig>"  
End Sub

Sub UpdtCData(baseNode, data)
  Dim oNode, oItem
  Set oNode = oXML.documentElement.selectSingleNode(baseNode & "/str")  
  If Not oNode Is Nothing Then oNode.parentNode.removeChild oNode
  Set oItem = oXML.createNode(1, "str", "")  
  Set oNode = oXML.documentElement.selectSingleNode(baseNode)
  oNode.appendChild oItem
  Set oNode = oXML.documentElement.selectSingleNode(baseNode & "/str")  
  Set oItem = oXML.createCDATASection(data)
  oNode.appendChild oItem
End Sub

Sub ClearNode(baseNode, node)
  Dim oNode, oItem
  Set oNode = oXML.documentElement.selectSingleNode(baseNode & "/" & node)  
  If Not oNode Is Nothing Then oNode.parentNode.removeChild oNode
  Set oNode = oXML.documentElement.selectSingleNode(baseNode)
  Set oItem = oXML.createElement(node)
  oNode.appendChild oItem
End Sub

Sub UpdtRecents()
  Dim oNode, oItem, i
  Set oNode = oXML.documentElement.selectSingleNode("app/RECENT_PROJECTS/astr")  
  oRS.Sort = arrFields(1) & " DESC"  
  oRS.MoveFirst
  i = 0
  While Not oRS.EOF And i < 20
    If oFSO.FileExists(oRS(arrFields(0))) Then
      Set oItem = oXML.createNode(1, "s", "")  
      oNode.appendChild oItem
      Set oItem = oXML.createCDATASection(oRS(arrFields(0)))
      oNode.childNodes(i).appendChild oItem
      i = i + 1
    End If
    oRS.MoveNext
  Wend
End Sub

Function UpdtConf(confFile, projDir, aInclDir, mingwDir, os)
  Dim oNode, oItem
  UpdtConf = False
  oXML.load confFile
  If oXML.parseError.errorCode Then Exit Function
  UpdtCData "compiler/sets/gcc/MASTER_PATH", mingwDir  
  UpdtCData "debugger_common/sets/gdb_debugger/conf1/values/EXECUTABLE_PATH", mingwDir & "\bin\gdb.exe"  
  UpdtCData "project_manager/DEFAULT_PATH", projDir & "\"  
  ClearNode "compiler/sets/gcc", "INCLUDE_DIRS"  
  UpdtCData "compiler/sets/gcc/INCLUDE_DIRS", mingwDir & "\mingw\include;" & aInclDir & ";"  
  ClearNode "compiler/sets/gcc", "LIBRARY_DIRS"  
  UpdtCData "compiler/sets/gcc/LIBRARY_DIRS", mingwDir & "\mingw\lib;"  
  UpdtCData "scripts/generic_wizard/DEBUG_OUTPUT", "bin\Debug_x" & os & "\"  
  UpdtCData "scripts/generic_wizard/DEBUG_OBJECTS_OUTPUT", "obj\Debug_x" & os & "\"  
  UpdtCData "scripts/generic_wizard/RELEASE_OUTPUT", "bin\Release_x" & os & "\"  
  UpdtCData "scripts/generic_wizard/RELEASE_OBJECTS_OUTPUT", "obj\Release_x" & os & "\"  
  Set oNode = oXML.documentElement.selectSingleNode("app/RECENT_PROJECTS/astr")  
  If Not oNode Is Nothing Then oNode.parentNode.removeChild oNode
  Set oItem = oXML.createNode(1, "astr", "")  
  Set oNode = oXML.documentElement.selectSingleNode("app/RECENT_PROJECTS")  
  oNode.appendChild oItem
  If oRS.RecordCount Then UpdtRecents
  oXML.save confFile
  UpdtConf = True
End Function

Sub UpdtCBProjFiles(os)
  Dim oNode, file
  If oRS.RecordCount = 0 Then Exit Sub
  oRS.MoveFirst
  While Not oRS.EOF
    On Error Resume Next
    file = oRS("path")  
    oXML.load file
    Set oNode = oXML.documentElement.selectNodes("Project/Build/Target[@title='Debug']")(0).selectNodes("Option[@output]")(0)  
    oNode.setAttribute "output", "bin/Debug_x" & os & "/" & oFSO.GetFileName(oNode.getAttribute("output"))  
    oXML.documentElement.selectNodes("Project/Build/Target[@title='Debug']")(0).selectNodes("Option[@object_output]")(0).setAttribute "object_output", "obj/Debug_x" & os & "/"  
    Set oNode = oXML.documentElement.selectNodes("Project/Build/Target[@title='Release']")(0).selectNodes("Option[@output]")(0)  
    oNode.setAttribute "output", "bin/Release_x" & os & "/" & oFSO.GetFileName(oNode.getAttribute("output"))  
    oXML.documentElement.selectNodes("Project/Build/Target[@title='Release']")(0).selectNodes("Option[@object_output]")(0).setAttribute "object_output", "obj/Release_x" & os & "/"  
    oXML.save file
    On Error Goto 0
    oRS.MoveNext
  Wend
End Sub

Function GetRelFolder(msg, style)
  Dim oDir, sel, diff, siz
  GetRelFolder = ""  
  Set oDir = oSH.BrowseForFolder(0, "Bitte wählen Sie das " & msg & "-Verzeichnis aus.", style, oWSH.CurrentDirectory)  
  If oDir Is Nothing Then Exit Function
  sel = oDir.Self.Path
  siz = Len(oWSH.CurrentDirectory)
  If Left(sel, siz) <> oWSH.CurrentDirectory Then Exit Function
  If siz = 3 Then siz = 2
  diff = Len(sel) - siz
  If diff < 1 Then Exit Function
  GetRelFolder = Right(sel, diff - 1)
  If Not oFSO.FolderExists(GetRelFolder) Then GetRelFolder = ""  
End Function

Sub ObtainSettings(cbDir, projDir, aInclDir, updtCmplr)
  Const head = "Wählen Sie nachfolgend das Verzeichnis aus, in dem ", tail = "Dieser Schritt wird wiederholt, wenn es sich nicht um ein Unterverzeichnis relativ zu diesem Script handelt."  
  oSH.MinimizeAll
  Do
    If MsgBox(head & """codeblocks.exe"" zu finden ist." & vbLf & tail, vbOKCancel Or vbInformation Or vbSystemModal, "Code::Blocks - Verzeichnis") = vbCancel Then WScript.Quit  
    cbDir = GetRelFolder("Code::Blocks", BIF_RETURNONLYFSDIRS Or BIF_NONEWFOLDERBUTTON)  
  Loop While cbDir = ""  
  Do
    If MsgBox(head & "Ihre Projekte gespeichert werden." & vbLf & tail, vbOKCancel Or vbInformation Or vbSystemModal, "Projects - Verzeichnis") = vbCancel Then WScript.Quit  
    projDir = GetRelFolder("Projects", BIF_RETURNONLYFSDIRS)  
  Loop While projDir = ""  
  Do
    If MsgBox(head & "Sie weitere Dateien ablegen können, die Sie in Ihre Codes einbeziehen wollen." & vbLf & tail, vbOKCancel Or vbInformation Or vbSystemModal, "Additional_Include - Verzeichnis") = vbCancel Then WScript.Quit  
    aInclDir = GetRelFolder("Additional_Include", BIF_RETURNONLYFSDIRS)  
  Loop While aInclDir = ""  
  updtCmplr = MsgBox("Möchten Sie, dass bei jedem Start überprüft wird, ob eine neue Version des Compilers verfügbar ist?" & vbLf & "(Zu diesem Zweck werden Informationen aus dem Internet angefordert.)", vbYesNoCancel Or vbQuestion Or vbSystemModal, "Versionsüberprüfung Compiler")  
  If updtCmplr = vbCancel Then WScript.Quit
  updtCmplr = vbNo - updtCmplr
  CreatePrtblConf cbDir, projDir, aInclDir, updtCmplr
  MsgBox "Ihre Einstellungen wurden in """ & prtblConf & """ abgelegt und können nachträglich in den ""path""- bzw. ""check""-Attributen geändert werden.", vbInformation Or vbSystemModal, prtblConf  
End Sub

Sub ReadSettings(cbDir, projDir, aInclDir, updtCmplr)
  oXML.load prtblConf
  If oXML.parseError.errorCode Then WScript.Quit MsgBox("Fehler in Datei """ & prtblConf & """" & vbLf & oXML.parseError.reason, vbCritical Or vbSystemModal, "Fehler")  
  Dim oNode : Set oNode = oXML.documentElement.selectSingleNode("relative_pathes/CBDir")  
  cbDir = oNode.getAttribute("path")  
  Set oNode = oXML.documentElement.selectSingleNode("relative_pathes/ProjDir")  
  projDir = oNode.getAttribute("path")  
  Set oNode = oXML.documentElement.selectSingleNode("relative_pathes/AdditionalIncludeDir")  
  aInclDir = oNode.getAttribute("path")  
  Set oNode = oXML.documentElement.selectSingleNode("search_compiler_update")  
  updtCmplr = CInt(oNode.getAttribute("check"))  
End Sub

Sub Main()
  Dim oProjDir, cbDir, projDir, aInclDir, confFile, mingwDir, appdataDir, os, updtCmplr
  If GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE Name='codeblocks.exe'").Count Then WScript.Quit  
  oWSH.CurrentDirectory = oFSO.GetParentFolderName(WScript.ScriptFullName)
  If oFSO.FileExists(prtblConf) Then : ReadSettings cbDir, projDir, aInclDir, updtCmplr : Else : ObtainSettings cbDir, projDir, aInclDir, updtCmplr : End If
  CheckDir , aInclDir
  CheckDir , cbDir
  CheckDir oProjDir, projDir
  oWSH.CurrentDirectory = cbDir
  If updtCmplr = 1 Then CheckVer
  If Not oFSO.FileExists("codeblocks.exe") Then WScript.Quit MsgBox("""codeblocks.exe"" konnte nicht gefunden werden." & vbLf & "Prüfen Sie den Pfad in """ & prtblConf & """.", vbCritical Or vbSystemModal, "Fehler")  
  oRS.Fields.Append arrFields(0), adVarChar, 255
  oRS.Fields.Append arrFields(1), adDate
  oRS.Open
  GetAllProjs oProjDir
  os = GetOSArch
  If os = "64" Then If MsgBox("Sollen 64-Bit-Anwendungen erstellt werden?", vbYesNo Or vbQuestion Or vbSystemModal, "Windows x64 detektiert.") = vbNo Then os = "32"  
  confFile = oFSO.BuildPath(cbDir, "AppData\codeblocks\default.conf")  
  mingwDir = oFSO.BuildPath(cbDir, "mingw" & os)  
  appdataDir = oFSO.BuildPath(cbDir, "AppData")  
  If Not oFSO.FileExists(confFile) Then
    If Not oFSO.FolderExists(appdataDir) Then oFSO.CreateFolder appdataDir
    If Not oFSO.FolderExists(appdataDir & "\codeblocks") Then oFSO.CreateFolder appdataDir & "\codeblocks"  
    CreateConfFile confFile
  End If
  If os = "32" Then os = "86"  
  If Not UpdtConf(confFile, projDir, aInclDir, mingwDir, os) Then WScript.Quit MsgBox("Der Pfad zu MinGW konnte in Datei" & vbLf & """" & confFile & """" & vbLf & "nicht angepasst werden." & vbLf & "Code::Blocks kann den Compiler nicht aufrufen.", vbCritical Or vbSystemModal, "Fehler")  
  oWSH.Environment("PROCESS")("APPDATA") = appdataDir  
  oWSH.Run "codeblocks.exe"  
  UpdtCBProjFiles os
End Sub

CodeBlocksPortable
    ├─ Additional_Include
    ├─ CodeBlocks
    │      ├─ mingw32
    │      ├─ mingw64
    │      ├─ share
    │      └─ (codeblocks.exe)
    │
    ├─ Projects
    └─ (CB-Portable-Launcher.vbs)

back-to-top5.1.1. Script speichern - How To
Wie ich erfahren habe, fällt es manch einem schwer den Code aus dem Forum als VBScript abzuspeichern.
  • Den gesamten Code markieren 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


  • Speichern.

back-to-top5.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 ... face-wink


back-to-top6. Weitere Informationen

back-to-top6.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".
Mit dem Update v. 07.12.2017 werden unterschiedliche Target-Pfade für x86 und x64 Programmdateien genutzt. Dazu werden zusätzlich zur Änderung der "default.conf" auch in sämtlichen Projektdateien (*.cbp) im "Projects" Verzeichnis die entsprechenden Target-Pfade aktualisiert. Das hat den Vorteil, dass es nicht zu Fehlern für nicht neu kompilierte Dateien für eine andere Prozessorarchitektur kommt, sowie dass Executables im "bin" Verzeichnis für unterschiedliche Prozessorarchitekturen auch in unterschiedlichen, entsprechend benannten Unterverzeichnissen gespeichert werden. Damit die Projektdateien aktualisiert werden können, müssen die Projekte aber bereits bei Start des Scripts im "Projects" Verzeichnis liegen. Projekte im Unterverzeichnis "_archive_" (siehe Punkt 3.) sind von dieser Aktualisierung ausgeschlossen.

back-to-top6.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.

back-to-top6.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" klickt oder das "obj" Subverzeichnis aus dem Projektordner löscht.
Das Update des VBScripts v. 07.12.2017 sollte Fehler dieser Art aber weitestgehend ausschließen.

back-to-top6.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.
Mit Script vom 23.04.2020 wird zusätzlich pthread statisch gelinkt, da diese Abhängigkeit für C++ nun auch existiert.

back-to-top6.5. Warum kennt der Compiler den C11 oder C++17 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++1z untereinander schreiben
    6. Mit OK bestätigen.
Mit Script vom 23.04.2020 wird diese Einstellung initial vorgenommen.

back-to-top6.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:
  • 30.04.2023 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst, Script: verkürzt und Suchpattern für neue Compilerversion an geänderte Dateinamen angepasst
  • 23.04.2020 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 23.04.2020 Script: Anpassung von Defaulteinstellungen
  • 20.10.2018 Text: Downloadlink für codeblocks.mo angepasst.
  • 26.07.2018 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 02.01.2018 Script: Anpassung des Kompatibilitätslayers um verschwommene Schrift bei C::B 17.12 und High DPI Displays zu vermeiden.
  • 01.01.2018 Text: an geänderte Voraussetzungen der neusten Compiler- und IDE-Version angepasst
  • 08.12.2017 Text: Punkte 6.1. und 6.3. aktualisiert.
  • 07.12.2017 Script: Unterschiedliche Target-Pfade für x86 und x64 Programmdateien sollen Fehler bei der Kompilierung desselben Projekts für unterschiedliche Prozessorarchitekturen verhindern.
  • 30.12.2016 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst, Download der Datei codeblocks.mo angepasst.
  • 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

Content-Key: 202510

Url: https://administrator.de/contentid/202510

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: bugmenot2
bugmenot2 22.03.2013 um 08:51:31 Uhr
Goto Top
Klasse Arbeit, funktioniert super.
Kleiner Hinweis noch, das vbs Script muss als Unicode gespeichert werden, sonst Fehlermeldung.
Ansonsten danke für die Mühe face-smile
Mitglied: rubberman
rubberman 22.03.2013, aktualisiert am 23.03.2013 um 12:23:40 Uhr
Goto Top
Hallo bugmenot2,

vielen Dank für dein Feedback face-smile 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).
  • OEM (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.
Mitglied: Friemler
Friemler 24.10.2014 aktualisiert um 10:52:19 Uhr
Goto Top
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. face-smile

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

Gruß
Friemler
Mitglied: rubberman
rubberman 24.10.2014 aktualisiert um 16:12:59 Uhr
Goto Top
Hallo Friemler.

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

Ach was, ich brauche keine Sternchen face-wink 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 face-smile)

Grüße
rubberman
Mitglied: 120263
120263 31.01.2015 um 09:53:55 Uhr
Goto Top
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
Mitglied: rubberman
rubberman 31.01.2015 aktualisiert um 12:51:16 Uhr
Goto Top
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 face-wink 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:
<?xml version="1.0" encoding="Windows-1252" standalone="yes"?> 
<!-- Einstellungen für CB-Portable-Launcher -->
<CB_Portable_Launcher_Config version="1"> 
	<relative_pathes description="Die path-Attribute geben die relativen Pfade an."> 
		<CBDir path="CodeBlocks" description="Pfad zum CodeBlocks - Rootverzeichnis, RELATIV zum Script" /> 
		<ProjDir path="Projects" description="Pfad zum Projects - Rootverzeichnis, RELATIV zum Script" /> 
		<AdditionalIncludeDir path="Additional_Include" description="Pfad zum Additional_Include - Rootverzeichnis, RELATIV zum Script" /> 
	</relative_pathes>
</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
Mitglied: knirschke
knirschke 19.12.2015 um 22:38:50 Uhr
Goto Top
Hallo rubberman,

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

knirschke von zahnstein
Mitglied: rubberman
rubberman 21.12.2015 aktualisiert um 12:43:49 Uhr
Goto Top
Hallo knirschke,

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

Grüße
rubberman
Mitglied: nrt4ipok
nrt4ipok 24.02.2016 aktualisiert um 18:39:01 Uhr
Goto Top
Hallo RalphHoffmann

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

alt:
        strRel = Right(strSelectedFolder, iDiff - 1)
neu:
        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
Mitglied: rubberman
rubberman 24.02.2016 um 21:48:57 Uhr
Goto Top
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 face-wink

Grüße
rubberman
Mitglied: nrt4ipok
nrt4ipok 25.02.2016 um 10:37:41 Uhr
Goto Top
Hallo rubberman,

Hier mein Code der Funktion GetRelFolder:
Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO)
  Dim objFolder, strRel, strThisFolder, strSelectedFolder, iDiff
  strRel = ""  
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName)
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _  
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder)  
  If Not objFolder Is Nothing Then
    strSelectedFolder = objFolder.Self.Path
    If InStr(1, strSelectedFolder, strThisFolder, vbTextCompare) = 1 Then
      iDiff = Len(strSelectedFolder) - Len(strThisFolder)
		If iDiff > 0 Then
        strRel = Right(strSelectedFolder, iDiff - 1)

MsgBox( _
	"strSelectedFolder(" & Len(strSelectedFolder) &")=" & strSelectedFolder & vbCrLf & _  
	"strThisFolder(" & Len(strThisFolder) &")=" & strThisFolder & vbCrLf & _  
	"iDiff=" & iDiff & vbCrLf & _  
	"strRel=" & Right(strSelectedFolder, iDiff - 1) )  

        If Not oFSO.FolderExists(strRel) Then strRel = ""  
      End If
    End If
    Set objFolder = Nothing
  End If
  GetRelFolder = strRel
End Function
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:
Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO)
  Dim objFolder, strRel, strThisFolder, strSelectedFolder, iDiff
  strRel = ""  
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName)
  If Right(strThisFolder,1) = "\" Or Right(strThisFolder,1) = "/" Then  
    strThisFolder = Left(strThisFolder,Len(strThisFolder) - 1)
  End If
  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _  
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder)  
  If Not objFolder Is Nothing Then
    strSelectedFolder = objFolder.Self.Path
    If InStr(1, strSelectedFolder, strThisFolder, vbTextCompare) = 1 Then
      iDiff = Len(strSelectedFolder) - Len(strThisFolder)
		If iDiff > 0 Then
        strRel = Right(strSelectedFolder, iDiff - 1)
        If Not oFSO.FolderExists(strRel) Then strRel = ""  
      End If
    End If
    Set objFolder = Nothing
  End If
  GetRelFolder = strRel
End Function

Grüße
nrt4ipok
Mitglied: rubberman
rubberman 25.02.2016 aktualisiert um 19:26:15 Uhr
Goto Top
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 face-wink

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 face-smile 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 ...
Mitglied: Friemler
Friemler 26.02.2016 aktualisiert um 10:28:06 Uhr
Goto Top
Hallo zusammen,

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

Function GetRelFolder(ByVal strMsg, ByVal iStyle, ByRef oFSO)
  Dim objFolder, strRel, strThisFolder, strSelectedFolder, iDiff

  strRel        = ""  
  strThisFolder = oFSO.GetParentFolderName(WScript.ScriptFullName)

  Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, _  
    "Bitte wählen Sie das " & strMsg & "-Verzeichnis aus.", iStyle, strThisFolder)  

  If Not objFolder Is Nothing Then
    strSelectedFolder = objFolder.Self.Path

    If Left(strSelectedFolder, Len(strThisFolder)) = strThisFolder Then
      iDiff  = Len(strSelectedFolder) - Len(Trim(oFSO.BuildPath(strThisFolder, " ")))  
      strRel = Right(strSelectedFolder, iDiff)
      If Not oFSO.FolderExists(strRel) Then strRel = ""  
    End If

    Set objFolder = Nothing
  End If

  GetRelFolder = strRel
End Function


Grüße
Friemler
Mitglied: nrt4ipok
nrt4ipok 26.02.2016 um 11:01:48 Uhr
Goto Top
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
Trim(oFSO.BuildPath(strFolder, " "))  
Grüße
nrt4ipok
Mitglied: rubberman
rubberman 26.02.2016 um 18:38:04 Uhr
Goto Top
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 face-smile

Grüße
rubberman
Mitglied: Friemler
Friemler 27.02.2016 aktualisiert um 07:38:48 Uhr
Goto Top
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... face-wink

Gruß
Friemler
Mitglied: rubberman
rubberman 27.02.2016 aktualisiert um 12:42:46 Uhr
Goto Top
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 face-smile 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." face-big-smile

Ob allerdings im hiesigen konkreten Anwendungsfall von GetRelFolder Überlegungen zur Performance überhaupt notwendig sind, darüber ließe sich schon diskutieren... face-wink
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
Mitglied: dome-xx
dome-xx 07.10.2016 um 17:52:39 Uhr
Goto Top
Hay Rubberman,

danke für diese super Anleitung. Jedoch habe ich das Problem, dass wenn ich zb. das bekannte Hello World Programm erstellen will, gebe ich das ein:

/* Das Hello-World-Programm */
2
3 #include <stdio.h>
4
5 int main()
6 {
7 printf("Hello World!\n");
8
9 return 0;
10 }


danach Speicher ich das ab in Projects. Danach klicke ich auf erstellen und Starten und dann kommt immer wieder:
Es sieht so aus als ob die Datei noch nicht erstellt worden ist. Möchten Sie die Datei jetzt erstellen?

Klicke ich auf Ja kommt die gleiche Meldung wieder. Klicke ich auf nein startet ein cmd Fenster das ich dann sofort beenden kann.
Ich hoffe du kannst mir helfen

Liebe Grüße

Dome
Mitglied: rubberman
rubberman 07.10.2016 um 19:17:24 Uhr
Goto Top
Hallo Dome.

Sieht aus als ist das dein erster Versuch überhaupt face-wink Es ist ohne weitere Informationen kaum möglich genau zu sagen, an was es liegt. Also starte mal einen komplett neuen Versuch.
  • CB-Portable-Launcher.vbs starten
  • Im Startfenster auf "Ein neues Projekt erstellen" klicken
  • Im Popupfenster "Console application" auswählen und auf "Go" klicken.
  • "C" auswählen und "Next" klicken.
  • Bei Project title z.B. HelloWorld eingeben und "Next" klicken.
  • "Finish" klicken.
  • Im Menü "Ansicht" Haken setzen bei
    • Manager
    • Logs
    • Statuszeile
  • Links im Manager Sidebar den Tab "Projekte" auswählen.
  • Dort "Arbeitsbereich"->"HelloWorld"->"Quellen" aufklappen und "main.c" doppelklicken.
  • Im Editorfenster rechts sollte nun bereits ein Hello World Code als Vorlage zu finden sein.
  • Auf Erstellen (Zahnrad-Symbol) klicken.
  • Sollten nun unten im "Logs & others" Fenster Fehlermeldungen erscheinen, bitte kopieren und hier posten
  • Falls nicht, sollte das Projekt erstellt worden sein und du kannst das Programm mit Klick auf Ausführen (grünes Dreieck) starten.

Was noch schief gegangen sein könnte:
- Falls du deine oben geposteten Zeilen samt Zeilennummern im Code stehen hast, geht's in die Hose. Die gehören nicht in einen C-Code.
- Dein Virenscanner könnte das Programm als sogenanntes "False Positive" erkannt haben und blockiert die Ausführung. Zum Test, schalte deinen Virenscanner vorübergehend aus und probiere noch einmal das Projekt zu erstellen.

Grüße
rubberman
Mitglied: Friemler
Friemler 07.10.2016 aktualisiert um 21:50:12 Uhr
Goto Top
Hallo rubberman,

Dein letzter Punkt (Virenscanner) könnte wirklich die Ursache sein, wenn man den Avira Virenschutz verwendet.

Ich habe bei mir hier die Free-Version des Tools laufen. Jedes Mal wenn ich mit CodeBlocks bzw. MinGW ein Programm als Debug-Build erstelle schlägt Avira Alarm, aber erst seit einigen Wochen. Zur Zeit wird das Muster "TR/Dropper.Gen" (ein generisches Muster) gemeldet, ich habe aber auch schon andere Meldungen erhalten. Wenn ich ein Release-Build erstelle gibt es keine Probleme.

Ich habe über die Rückmeldefunktion des Virenschutz-Tools schon 3 Meldungen abgesetzt mit dem Hinweis "False Positive", was mir von Avira auch bestätigt wurde. Außerdem wollten sie das Erkennungsmuster aus ihrer Datenbank entfernen. Beim nächsten Compilieren kam allerdings lediglich eine andere Meldung.

@dome-xx: Schalte die Build-Konfiguration mal auf Release und teste dann nochmals.

[EDIT]
Ich nutze MinGW 6.1.0
[/EDIT]

Grüße
Friemler
Mitglied: rubberman
rubberman 07.10.2016 um 22:00:10 Uhr
Goto Top
Hallo Friemler,

ist mir noch gar nicht aufgefallen. Kompiliere sowieso meistens im Release Modus. Ich kann mich aber erinnern, dass Release Builds in der Vergangenheit tendenziell häufiger angemeckert wurden. Scheint sich ja nun geändert zu haben face-confused

Grüße
rubberman
Mitglied: dome-xx
dome-xx 10.10.2016 um 18:56:04 Uhr
Goto Top
Hay Rubberman,

ja es war mein erster Versuch überhaupt und es lag daran, dass ich kein Project erstellt habe.
Jetzt läuft alles super.
Danke für deine Hilfe face-smile
Ich hoffe, dass ich dich bei sonstigen Fragen weiter um Rat fragen kann.

Liebe Grüße

Dome
Mitglied: rubberman
rubberman 11.10.2016 um 00:15:51 Uhr
Goto Top
Hallo Dome.

Ich hoffe, dass ich dich bei sonstigen Fragen weiter um Rat fragen kann.
Wenn es mit meiner Anleitung zu tun hat, dann gerne hier. Für Themen die C oder C++ betreffen solltest du aber alle Mitglieder ansprechen, indem du ein neues Thema im Forum eröffnest. Eines der Vorteile eine Forums ist, dass nicht nur einer allein sein Wissen weitergibt face-wink

Grüße
rubberman
Mitglied: TheBattleWolf
TheBattleWolf 24.11.2016 um 19:08:00 Uhr
Goto Top
Hallo koenntest du mir erklaeren wie man in der portablen Version den style aender als z.B zum Vim style und es sollte nach moeglichkeit auch auf anderen PC so bleiben?

Vielen Dank
-Wolf
Mitglied: rubberman
rubberman 24.11.2016 um 21:50:39 Uhr
Goto Top
Hallo Wolf

Sorry, aber als Pragmatiker sind mir Dinge wie das Erscheinungsbild der IDE reichlich egal (falls du mit "Style" darauf abzielen solltest). Unter Menü "Einstellungen" -> "Editor..." kannst du Einstellungen dahingehend vornehmen.
Wenn du statt dessen auf eine Vim - ähnliche Funktionsweise der IDE abzielst, dann verweist mich Google auf dieses Plugin.

Grüße
rubberman
Mitglied: TheBattleWolf
TheBattleWolf 24.11.2016 um 22:06:33 Uhr
Goto Top
http://wiki.codeblocks.org/index.php/Syntax_highlighting_custom_colour_ ...

In dieser Anleitung wird beschrieben wie man andere styles hinzufügt(einfach mal in den Punkt Installation schauen) und hier wird beschrieben das man die colour_themes.conf Datei abändert die wird allerdings lokal gespeichert und du hast es ja mit deinem script geschafft die default.conf portabel zu machen ginge das noch auch mit dieser Datei z.B durch ergänzen des VBS (so wie du es unter 6.1 beschrieben hättest) währe nett wenn du mir helfen könntest.
Mitglied: rubberman
rubberman 24.11.2016 aktualisiert um 23:28:01 Uhr
Goto Top
Hallo Wolf

Das ist nicht besonders schwierig, denn auch diese Einstellungen landen in der default.conf.
Schließe Code::Blocks, gehe im Explorer nach
CodeBlocksPortable\CodeBlocks\AppData\codeblocks
und öffne die default.conf mit einem Texteditor. Dort suchst du nach dem <editor> Tag und ersetzt dort alles von <colour_sets> bis </colour_sets> mit dem Code von <colour_sets> bis </colour_sets> aus dem "Installation" Abschnitt der verlinkten Seite. Speichern, das war's. (Mach aber sicherheitshalber vorher ein Backup der Datei ...)
Nun startest du das VBScript, wenn sich Code::Blocks geöffnet hat, gehst du im Menü "Einstellungen" -> "Editor...", klickst links auf "Syntax Hervorhebung", wählst oben dein Farbthema und klickst unten auf OK.
vimstyle

Grüße
rubberman
Mitglied: TheBattleWolf
TheBattleWolf 25.11.2016 um 13:30:19 Uhr
Goto Top
Super hat gut geklappt echt spitzen Arbeit!
Vielen Dank!

-Wolf
Mitglied: lutwin52
lutwin52 04.08.2019 um 19:20:26 Uhr
Goto Top
Danke, hab selten eine so gute Anleitung gehabt. Hat auf Anhieb geklappt.
Eigentlich wollte ich CodeBlocks nur auf deutsch haben.
Nun ist es auch in meiner PortableApps-Sammlung. Super!
Mitglied: rubberman
rubberman 30.04.2023 um 19:24:10 Uhr
Goto Top
Hallo,

nach langer Zeit habe ich hier wieder geupdatet, da sich die Archivnamen der Compiler geändert haben. Wer Einstellungen zur automatischen Suche von Compilerupdates nutzt, sollte den neuen Scriptcode der "CB-Portable-Launcher.vbs" nutzen.

Grüße
Steffen
Mitglied: rubberman
rubberman 11.11.2023 um 16:36:13 Uhr
Goto Top
Diese Anleitung ist nun veraltet. "Breaking Changes" sind erforderlich geworden. Somit gibt es einen neuen Thread als Nachfolge:
CodeBlocks Portable mit MinGW 32 und 64 Bit unter Windows

Grüße
Steffen