Administrator Startseite

Apple

iOS, iTunes, Mac OS X

Entwicklung

Assembler, BASIC, Batch & Shell, Bibliotheken & Toolkits, CSS, C und C++, Datenbanken, HTML, IDE & Editoren, Installation, Java, JavaScript, KiXtart, Lizenzierung, Pascal & Delphi, Perl, PHP, Python, VB for Applications, Visual Studio@, Webentwicklung, XML

Hardware

Benchmarks, Cluster@, CPU, RAM, Mainboards, Drucker und Scanner, Festplatten, Raid, Grafikkarten & Monitore, LAN, WAN, Wireless@, Multimedia & Zubehör, Notebook & Zubehör, Router & Routing@, SAN, NAS, DAS, Server-Hardware, Sonstige Peripheriegeräte, Speicherkarten, Switche und Hubs

Internet

Blogs, CMS, Domain Registrierung, E-Books, E-Business, E-Mail, Flatrates, Hosting & Housing, Informationsdienste, Instant Messaging, Onlinedienste, SEO, Server, Soziale Netzwerke, Utilities, Webbrowser

Linux

Apache Server, Debian, Desktop, Netzwerk, OpenOffice, LibreOffice, RedHat, CentOS, Fedora, Samba, Suse, Tools & Utilities, Ubuntu, Userverwaltung

Microsoft

Exchange Server, Hyper-V@, Installationsprobleme, Netzwerk, Office, Outlook & Mail, Systemdateien, Tools & Utilities, Userverwaltung, Visual Studio@, Windows 7, Windows 8, Windows Phone, Windows Server, Windows Vista, Windows XP

Multimedia

Audio, Digitiales Fernsehen, Grafik, Icons, Schriftarten, Video

Netzwerke

Cluster@, DNS, DSL, VDSL, Groupware, Grundlagen, ISDN & Analoganschlüsse, LAN, WAN, Wireless@, Monitoring, Netzwerkmanagement, Netzwerkprotokolle, Router & Routing@, TK-Netze & Geräte, UMTS, EDGE & GPRS, Voice over IP

Off Topic

Humor (lol), Administrator.de Feedback, Papierkorb

Sicherheit

Backup, Erkennung und -Abwehr, Firewall, Grundlagen, Informationsdienste, Rechtliche Fragen, Sicherheits-Tools, Tipps & Tricks, Verschlüsselung & Zertifikate, Viren und Trojaner

Sonstige Systeme

Google Android, MikroTik RouterOS, Novell Netware, Sun Solaris

Virtualisierung

Hyper-V@, KVM, Vmware, Xenserver

Weiterbildung

Aus- und Weiterbildung, Ausland, Schulung & Training, Studentenjobs & Praktikum

Zusammenarbeit

Biete Zusammenarbeit, Suche Projektpartner
Weniger Werbung?
Cover IT-Administrator
In der Juni-Ausgabe des IT-Administrator Magazins dreht sich alles um den Schwerpunkt 'Monitoring & Dokumentation'. So zeigen Ihnen die Redaktion unter anderem, wie die Netzwerküberwachung in heterogenen Umgebungen mit Zenoss funktioniert und auf welchem Weg Sie Leistungsdaten von Windows-Clients mit der PowerShell abfragen. Daneben lesen Sie, wie Sie die I/O-Last auf Ihren Servern im Blick behalten und Ihr Red Hat Enterprise Linux auf Trab bringen. ... mehr
Mitglied: rubberman
28.02.2013, aktualisiert 09.01.2014, 5155 Aufrufe, 2 Kommentare, 3

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.



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.

2. Voraussetzungen

2.1. Systemvoraussetzungen

- Windows Betriebssystem (bislang getestet unter XP x86, sowie Win7 x86 und Win7 x64)
- ca. 930 MB Speicherplatz (Stand Dez. 2013)

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

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

4. Installationen

4.1. Code::Blocks (IDE)

Die codeblocks-NN.MM-setup.exe hier (www.codeblocks.org/downloads/binaries) downloaden. NN.MM steht dabei für die aktuelle Version.
WICHTIG: Nicht die mingw enthaltenden Setups herunterladen! Dort käme eine GCC Version mit, die unvollständige Windows Header beinhaltet.

Da wir eine portable Version erstellen wollen, kann man bereits bei der Installation "Datenmüll" vermeiden:
  • Setup starten
  • Nach dem Bestätigen der Lizenzbedingungen kommt man in die Sicht "Choose Components". Dort "Default install" aufklappen und den Haken bei "Shortcuts" entfernen. Anderenfalls hast du später ungültige Verknüpfungen zu Code::Blocks auf dem Rechner.
  • In der nächsten Sicht "Choose Install Location" auf den "Browse..." Button klicken, zum vorher erstellten "CodeBlocksPortable" Verzeichnis navigieren und bestätigen. Nun sollte im Textfeld "[Laufwerk]:\[Pfad]\CodeBlocksPortable\CodeBlocks" stehen.
  • Installation fortsetzen. Nach erfolgter Installation poppt eine Message auf, in der du gefragt wirst "Do you want to run Code::Blocks now?". Dort bitte auf "Nein" klicken! Anderenfalls werden Verzeichnisse und Dateien im %AppData% Verzeichnis erstellt, die wiederum ungenutzt in deinem Benutzerprofil liegen bleiben.

Die Verzeichnisstruktur sollte nun um das CodeBlocks Unterverzeichnis erweitert worden sein:
CodeBlocksPortable 
    |- Additional_Include 
    |- CodeBlocks 
    |      |- share 
    |      |- (codeblocks.exe) 
    |- Projects
... wobei sich die codeblocks.exe direkt im CodeBlocks Unterverzeichnis befindet. (Diese bitte niemals per Doppelklick starten. Das erledigt das VBScript später.)

4.2. MinGW32 und MinGW64 (Compiler)

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

4.3. Deutsches Menü gefällig?

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

5. CB-Portable-Launcher.vbs

5.1. Das Script

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

CodeBlocksPortable 
    |- Additional_Include 
    |- CodeBlocks 
    |      |- mingw32 
    |      |- mingw64 
    |      |- share 
    |      |- (codeblocks.exe) 
    |- Projects 
    |- (CB-Portable-Launcher.vbs)

5.1.1. Script speichern - How To
Wie ich erfahren habe, fällt es manch einem schwer den Code aus dem Forum als VBScript abzuspeichern.
  • Rechts über dem Code gibt es den Link "Quelltext". Bei Mausklick öffnet sich ein neues Fester mit dem Code in Plaintext.
  • Den gesamten Code markieren ([Strg]+[A]) und kopieren ([Strg]+[C]).
  • Den Windows Editor öffnen. Bspw. so:
    • Tastenkombination [Windows]+[R],
    • notepad.exe in den geöffneten "Ausführen" Dialog schreiben,
    • OK anklicken.
  • Den kopierten Code einfügen ([Strg]+[V]).
  • Menü Datei -> Speichern unter...
  • In das CodeBlocksPortable Verzeichnis navigieren
  • Codierung auf ANSI stellen, Dateityp Alle Dateien (*.*) auswählen, Dateiname CB-Portable-Launcher.vbs
Klicken Sie auf das Bild, um es zu vergrößern - 2bc762ffc93b1837c47c0db5dbae85b6.png

  • Speichern.

5.2. Der erste Start

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

Geschafft! Nun kannst du endlich loslegen ... face-wink


6. Weitere Informationen

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

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

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

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


Grüße
rubberman


Änderungen:
  • 03.01.2014 Text: Punkt 3. ergänzt, Punkt 5.1.1. hinzu
  • 01.01.2014 Text: Abbildung und Beschreibung "Neu erstellen" hinzu
  • 07.12.2013 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 12.04.2013 Text: an geänderte Voraussetzungen der neusten Compilerversion angepasst
  • 02.03.2013 Script: Aktualisierung Debugger hinzugefügt

Mitglied: bugmenot2
22.03.2013 um 08:51 Uhr, 1
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
Bitte warten ..
Mitglied: rubberman
22.03.2013 um 19:21 Uhr
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).
  • ASCII (CP 850) Funktioniert, auch wenn Umlaute natürlich falsch dargestellt werden da die Interpretation als ANSI Zeichensatz ausgeführt wird.
  • UTF-16(LE) Funktioniert, wie auch von dir getestet.
  • UTF-16(BE) Script bricht mit Fehlermeldung "Ungültiges Zeichen" in Zeile 1, Zeichen 1 ab. Hier wird offensichtlich bereits über das Byte Order Mark gemeckert. VBScript unterstützt diesen Zeichensatz grundsätzlich nicht.
  • UTF-8 Funktioniert nicht. Hier gilt das gleiche wie für UTF-16 Big Endian.
Bitte warten ..
Neuester Wissensbeitrag
BASIC
Tipp: Für all jene, die schnell mal eine <u>simple HTML-Tabelle</u benötigen, ist das folgende Skript gedacht. Der Name der fertigen Tabelle sowie die Anzahl der Spalten und Zeilen wird ... von Gurkenhobel, in BASIC
Diese Inhalte könnten dich auch interessieren
Installationsprobleme
Frage: Hallo @ all ich beschäftige mich gerade mit MDT. Ich möchte es so realisieren, dass ich eine Tasksequenz habe, wo ich bei der User Driven Methode nicht nur ... von nEmEsIs, in Installationsprobleme
Tools & Utilities
Frage: Hallo zusammen, . ich habe mehrere Frage in unterschiedlichen Kategorien, nicht wundern. Ich hoffe, ich bin hier richtig mit meiner RAM Disk. - Ist es möglich eine RAM ... von nistra, in Tools & Utilities
Windows 7
Frage: Hallo, ein Rechner bekommt seit einiger Zeit Bluescreens in unregelmäßigen Abständen. Neue Software oder Hardware wurde nicht verbaut. Ich habe den Bluescreen mittels BlueScreenView ausgewertet. Hat jemand eine ... von xbast1x, in Windows 7
Windows 7
Frage: Hallo, auf einer Fujitsu CAD Workstation mit Windows 7 64 bit kommt plötzlich die Meldung "Nicht unterstützte 64bit Anwendung". Beim hochfahren wird bei Anmeldung (egal welcher User) immer ... von Anulu1, in Windows 7
Installationsprobleme
Frage: Hallo, habe vom selben USB Stick wie einige Tage zuvor eine WIN 7 Installation auf ein mit WIN 8 verseuchtes Gerät gespielt. Nach den Änderungen im UFEI war ... von reinsala, in Installationsprobleme
Heiß diskutierte Inhalte
Netzwerkmanagement
Frage: Hallo Leute, Ich habe wieder ein Problem. Ich habe im Geschäft einen PC der mit dem Firmen Netzwerk verbunden ist. Wir nutzen immer die Remotedesktopverbindung funktioniert auch immer. ... von Questionmark93, in Netzwerkmanagement
Netzwerke
Frage: Hallo, ich habe jetzt schon den halben Nachmittag damit verbracht eine VPN Verbindung zu erstellen bzw. nach einer passenden Lösung im Internet zu finden - leider ohne Erfolg! ... von Nutzername123, in Netzwerke
Festplatten, Raid
Frage: Hallo zusammen, folgende Ausgangslage: HP ProLiant ML350 G5 Server 4x HP SAS Festplatten davon 1 Hotspare im RAID5 Verbund. Smart Array P400 Controller Aufgrund einer elektrotechnischen Überprüfung im ... von e2Mario, in Festplatten, Raid
Windows Server
Frage: Hallo zusammen, ich habe derzeit ein kleines Problem und hatte gehofft das ich hier evtl. ein paar Tips bekommen könnte. Es geht um einen Betrieb den mein Chef ... von aladini, in Windows Server
Netzwerk
Frage: Gute Tag, folgendes Problem stellt sich nach einer Umstellung einiger Systembezogenen Optionen bei uns ein. Ich setze in unserer Firma seit kurzer Zeit Redirected Folders mit Offline Files ... von m.pohl, in Netzwerk