(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
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
(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:
Du kannst diesen Verzeichnissen auch andere Namen geben, schließlich musst du damit arbeiten können.
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:
(Die codeblocks.exe bitte niemals per Doppelklick starten. Das erledigt das VBScript später.)
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\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).
Starte Code::Blocks aber noch nicht. Führe erst alle weiteren Schritte aus.
Das Script unter dem Name "CB-Portable-Launcher.vbs" im "CodeBlocksPortable" Verzeichnis speichern.
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 ...
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.
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.
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.
6.4. Warum sind die Linkeroptionen
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.
Wenn du automatisch darüber informiert werden willst wenn eine neue Compilerversion verfügbar ist, ändere in der "CB-Portable-Config.xml" im Knoten
Änderungen:
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
Inhaltsverzeichnis
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
Steffen
2. Voraussetzungen
2.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)
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
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-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
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-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
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).
CodeBlocksPortable
├─ Additional_Include
├─ CodeBlocks
│ ├─ mingw32
│ ├─ mingw64
│ ├─ share
│ │ └─ CodeBlocks
│ │ └─ locale
│ │ └─ de_DE
│ │ └─ (codeblocks.mo)
│ │
│ └─ (codeblocks.exe)
│
└─ Projects
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.
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)
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.- 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.
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".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.
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" 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.
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.Mit Script vom 23.04.2020 wird zusätzlich pthread statisch gelinkt, da diese Abhängigkeit für C++ nun auch existiert.
6.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:- Menü "Settings" ("Einstellungen")
- "Compiler..."
- Ein neues Fenster öffnet sich mit dem übergeordneten Tab "Compiler settings"
- Untergeordneter Tab "Other Options" ("Andere Optionen")
- In die Textbox
-std=c11
und-std=c++1z
untereinander schreiben - 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:
- 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
Please also mark the comments that contributed to the solution of the article
Content-ID: 202510
Url: https://administrator.de/contentid/202510
Printed on: October 5, 2024 at 10:10 o'clock
31 Comments
Latest comment
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
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
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
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
Hallo RalphHoffmann
Hab das selbe Problem mit Win10 64 bit gehabt, gelöst durch ändern der Funktion "Right" in Zeile 39 von Script
alt:
neu:
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
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)
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
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) )
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) )
Hallo zusammen,
ich hätte da noch eine etwas kürzere alternative Version:
Grüße
Friemler
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
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
Grüße
nrt4ipok
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, " "))
nrt4ipok
Moin rubberman!
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
Gruß
Friemler
Zitat von @rubberman:
Kürzerer Code muss dann also nicht zwangsläufig eine bessere Performance bedeuten.
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
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
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
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
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
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.
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.