Incbin eingebundene Anwendung starten
Übersicht

![]() |
BlitzMoritzBetreff: Incbin eingebundene Anwendung starten |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine ausführbare Datei soll per "Incbin" eingebunden und per "CreateProcess" gestartet werden:
Code: [AUSKLAPPEN] Incbin "programm"
CreateProcess("incbin::programm") An der Größe der Gesamt-Datei lässt sich schließen, dass das "programm" tatsächlich integriert wurde, leider wird es mit "CreateProcess" nicht gestartet. Es erscheint auch keine Fehlermeldung. Muss das eingebundene Programm irgendwie anders angesprochen werden? Oder eignet sich "Incbin" für solche Zwecke generell nicht, sondern nur für Bilder, Sounds etc.? |
||
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Denke nicht, dass das so geht.
Du kannst die Datei aber zuvor in einen Ordner zwischenspeichern (Siehe IncBinLen, IncBinPtr und die Befehle zum schreiben von Dateien) und dann ausführen. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Suco hat recht, du brauchst aber nur folgendes:
Code: [AUSKLAPPEN] CopyFile("incbin::programm.exe", "programm.exe")
Wichtig ist, dass das Modul BRL.RamStream eingebunden ist. |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jupp, so sollte es gehen, aber man sollte das Programm dann vorzusweise in dem Temp-Ordner oder so kopieren. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wieso in den Temp-Ordner? Der ist doch eh mist :-/
Viele Programme tuen da ihr Zeugs rein, aber rausgelöscht wird es nicht mehr. Mein Temp-Ordner ist schonwieder 1 GB groß... |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Anständige Systeme leeren den soweiso beim Start/Shutdown. Wer sagt denn auch, dass das Programm die Datei nicht mehr löschen soll? Soll es doch, aber es ist meiner Meinung nach nicht sinn der Sache, dass das Programm um sich rum erstmal seine Bestandzeile aufreiht. Mehr als eine Konfigurationsdatei sollte es nicht erstellen. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank für Eure Tipps.
Das Schreiben auf Festplatte wollte ich eigentlich vermeiden, aber anders geht's wohl nicht. ![]() Für Sudo-X's Vorschlag habe ich im englischsprachigen BlitzBasic-Forum folgende Anweisung gefunden: Code: [AUSKLAPPEN] SaveBank CreateStaticBank(IncbinPtr("program"),IncbinLen("program")), "program" Unter Windows XP haben Eure beiden Vorschläge geklappt. Interessanter Weise aber nicht unter Linux: Ausführbare Dateien haben dort ja keine eindeutige Endung wie ".exe" und prompt hat der Kopiervorgang die Datei irgendwie "unausführbar" gemacht: Fehlermeldung: Xlib: unexpected async reply Hat jemand dafür noch 'ne Lösung? ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
chmod benutzen um ausführbar zu machen und dafür sorgen, dass du es in einen User Folder entpackst. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nochmal zum in dem Temp-Ordner tun:
Das ist richtig, dass man das tun sollte, da das Programm sonst daran scheitert, dass es eventuell keine Schreibrechte im Verzeichnis hat, in dem es liegt. Für den Temporären Ordner hat es Schreibrechte. |
||
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bitte um Entschuldigung, aber mein bisheriges Wissen ist noch stark begrenzt: ![]() 1.) Habe einen Befehl "chmod" nirgends gefunden. Gehört der überhaupt zur BMax-Syntax oder ist das nicht ein Konsolenbefehl von Linux? Dort würde er mir doch nichts nützen. 2.) Kann man stattdessen mit "SetFileMod" etwas erreichen? Wo findet man Konstanten dafür? 3.) Wie kann man systemunabhängig das "Temp"-Verzeichnis ermitteln? Vielen Dank für Eure Geduld... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Ist ein Linux befehl. system_() erlaubt es dir, den Befehl auszuführen.
2. Weiss nicht, sofern es die Fileausführungsrechte festlegt. Denk aber nicht das BM einen Befehl enthält, der nur auf Unix geht und nicht unter Windows 3. Garnicht. Da musst du dir für jedes System ne eigene implementation machen (die kannst du dann in eine funktion packen und mit ?linux ?win32 etc für osx, windows und linux jeweils selektiv kompilieren. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie cool! ![]() Man kann ja sämtliche Konsolenbefehle umsetzen und das ganze System beherrschen. Durch die folgenden Eingriffe klappte es auch unter Linux, vielen Dank nochmal für eure kompetenten Hilfestellungen. Code: [AUSKLAPPEN] Local TmpDir:String
?Linux TmpDir = "/tmp/" ?Win32 TmpDir = "C:/WINDOWS/Temp" ? CopyFile("incbin::program", TmpDir + "program") ?Linux system_("chmod +x " + TmpDir + "program") ? CreateProcess(TmpDir + "program") Da ich keinen "Mac" besitze, kenne ich das entsprechende Verhalten dort nicht. Vielleicht könnte ein Insider den obigen Code diesbezüglich vervollständigen. Die Möglichkeit, diverse Programme "versteckt" in das eigene Programm einzubinden, ist doch nicht schlecht, oder? Leider bläht sich dadurch die Gesamtdateigröße ziemlich auf. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
der code ist falsch:
TmpDir = "C:/WINDOWS/Temp" ist nicht zwingend das temp dir (bei mir zb ist das ausgelagert auf ne andere partition die einige duzend gigabyte mehr hat ![]() Noch muss C überhaupt die Windowspartition sein. Um den Temp Pfad unter Windows zu bestimmen, musst du die Umgebungsvariable tmp und temp abfragen |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
C:/WINDOWS/Temp ist natürlich naiv ![]() Über die Windows-Konsole erhält man das Gesuchte durch echo %TEMP%. Wie aber fange ich die Antwort auf? system_("echo %TEMP%") gibt nichts Gescheites zurück. |
||
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Folgender Code benötigt das FreeProcess-Modul, welches aber schon bei BlitzMax bei ist.
Müsste entweder mit TProc.Run("echo %TEMP%") oder TProc.Run("cmd echo %TEMP%") funktionieren. Ich kanns grad nicht testen. Code: [AUSKLAPPEN] SuperStrict
Import PUB.FreeProcess Type TProc ' Führt eine Datei aus Function Run:String(file:String, flag:Int = 0) Local process:TProcess = TProcess.Create(file, flag) Local result:String While process.status() Delay 1 While process.pipe.readAvail() result :+ Chr(process.pipe.ReadByte() ) Wend Wend While process.pipe.readAvail() result :+ Chr(process.pipe.ReadByte() ) Wend process.terminate() Return result.Trim() EndFunction ' Macht Anführungszeichen um einen String Function Quote:String(text:String) Return "~q" + text + "~q" EndFunction EndType |
||
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nun ja - schade, dass nicht manche Hilfestellung konkreter und zielgerichteter sein kann.
Bei meinem syntaktisch richtigen, aber nicht optimalen Code (weil nicht PC-unabhängig) hätte der folgende kurze Hinweis genügt - und fertig wär's gewesen: Ersetze "C:/Windows/temp" durch "GetEnv_("TMP)" Statt dessen muss man stundenlang über eine Kleinigkeit recherchieren: Der Befehl "GetEnv_" taucht in keiner Hilfe auf und scheint nirgends dokumentiert zu sein, statt dessen landet man im Forum trotz "eingeschränkter Suche" immer wieder bei BlitzBasic-Tipps, deren Syntax nicht auf BM anzuwenden ist oder deren Befehle nur geringfügig, aber entscheidend anders geschrieben werden, z.B. GetEnv und GetEnv_ Gibt es da nicht Möglichkeiten, die Bereiche klarer voneinander abzutrennen? |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
GetEnv_ ist wie System_ kein offizieller Befehl.
Das heisst die Befehle haben je nach OS teils ne andere wirkung oder garkeine Wirkung. Deswegen sind sie nicht dokumentiert. Nutzer von Blide und so finden sie jedoch recht easy bei bedarf durch autocompletition. Und ja die möglichkeit gibt es: Erweiterte Suche und nur in der BM kategorie suchen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, ich denke, dass mein Anliegen mit folgendem Code universell machbar sein sollte, wobei der MacOs-Fall hypothetisch ist, da ich ihn noch nicht ausprobieren konnte. Vielleicht könnte ein Mac-User ihn bestätigen.
Das Herzstück ist natürlich die TempDirSearch-Function, mit der mit einer gewissen Wahrscheinlichkeit irgendein Verzeichnis gefunden wird, auf dem man Schreibrechte besitzt. Falls es sich nicht um einen temporären Ordner handelt, sollte man natürlich nach Abschluss der Prozesse alles wieder löschen. Code: [AUSKLAPPEN] Incbin "program"
Local TempDir:String = TempDirSearch$() ?Win32 CopyFile("incbin::program", TempDir + "/program.exe") CreateProcess(TempDir + "/program.exe") ?Linux CopyFile("incbin::program", TempDir + "/program") system_("chmod +x " + TempDir + "/program") CreateProcess(TempDir + "/program") ?MacOS CopyFile("incbin::program", TempDir + "/program.app") system_("chmod +x " + TempDir + "/program.app") CreateProcess(TempDir + "/program.app") ? '----------------------------------------------------------------------------------- Function TempDirSearch$() Local i:Byte Local tmpdirlist:String[] 'Liste potentieller Kandidaten ?Win32 tmpdirlist = [GetEnv_("TMP"), GetEnv_("USERPROFILE"), GetEnv_("ALLUSERSPROFILE"), GetEnv_("windir") + "/Temp", CurrentDir()] ?Linux tmpdirlist = ["/tmp", GetEnv_("HOME"), CurrentDir()] ?MacOS tmpdirlist = [GetEnv_("TMPDIR"), "/temp", GetEnv_("HOME"), CurrentDir()] ? For i = 0 To Len(tmpdirlist) - 1 'die Kandidaten werden getestet: If FileType(tmpdirlist[i]) = 2 Then 'das Verzeichnis existiert! If WriteFile(tmpdirlist[i] + "/filewritingtest") Then 'es konnte geschrieben werden! DeleteFile(tmpdirlist[i] + "/filewritingtest") Return tmpdirlist[i] End If End If Next Notify ("Auf dem vorliegenden Betriebssystem konnte~nkein temporäres Verzeichnis ermittelt werden,~nfür welches Schreibrechte bestehen.~nDas Programm wird abgebrochen.") End End Function |
||
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beim Test auf einem Mac stellte sich heraus, dass sich dort doch einiges anders verhält als im obigen Code angenommen.
Der folgende Code korrigiert bzw. verbessert erstens die Liste potentieller temporärer bzw. beschreibbarer Verzeichnisse. Zweites berücksichtigt er, dass die auf MacOS ausführbaren Dateien mit der Endung .app eigentlich verkappte Ordner sind, die so einiges enthalten, aber mit 'incbin' weder richtig 'eingepackt' noch mit 'system_(chmod +x)' als ausführbar markiert werden können. Der Aufwand ist also etwas größer: Entsprechende (Unter-)Verzeichnisse müssen angelegt und die eigentliche, darin versteckte ausführbare Datei portiert werden. Ob dabei allerdings die Dateien Info.plist und program.icns tatsächlich gebraucht werden, ist fraglich. Zu Sicherheit sind sie hier dabei: Code: [AUSKLAPPEN] 'Vorraussetzung: Im aktuellen Verzeichnis befindet sich eine ausführbare Datei namens 'program'
Local TmpDir:String = TmpDirSearch$() ?Win32 Incbin "program.exe" CopyFile("incbin::program", TmpDir + "/program.exe") CreateProcess(TmpDir + "/program.exe") ?Linux Incbin "program" CopyFile("incbin::program", TmpDir + "/program") system_("chmod +x " + TmpDir + "/program") CreateProcess(TmpDir + "/program") ?MacOS Incbin "program.app/Contents/MacOS/program" Incbin "program.app/Contents/Info.plist" Incbin "program.app/Contents/Resources/program.icns" CreateDir(TmpDir + "/program.app") CreateDir(TmpDir + "/program.app/Contents") CreateDir(TmpDir + "/program.app/Contents/MacOS") CreateDir(TmpDir + "/program.app/Contents/Resources") CopyFile("incbin::program.app/Contents/MacOS/program", TempDir + "/program.app/Contents/MacOS/program") CopyFile("incbin::program.app/Contents/Info.plist", TempDir + "/program.app/Contents/Info.plist") CopyFile("incbin::program.app/Contents/Resources/program.icns", TempDir + "/program.app/Contents/Resources/program.icns") system_("chmod +x " + TmpDir + "/program.app/Contents/MacOS/program") CreateProcess(TmpDir + "/program.app") ? '----------------------------------------------------------------------------------- Function TmpDirSearch$() Local i:Byte Local tmpdirlist:String[] 'Liste potentieller Kandidaten ?Win32 tmpdirlist = [GetEnv_("TMP"), GetEnv_("windir") + "/Tmp", GetEnv_("USERPROFILE"), GetEnv_("ALLUSERSPROFILE"), CurrentDir()] ?Linux tmpdirlist = ["/tmp", "/var/tmp", GetEnv_("HOME"), CurrentDir()] ?MacOS tmpdirlist = [GetEnv_("TMPDIR"), "/tmp", "/var/tmp", GetEnv_("HOME"), CurrentDir()] ? For i = 0 To Len(tmpdirlist) - 1 'die Kandidaten werden getestet: If FileType(tmpdirlist[i]) = 2 Then 'das Verzeichnis existiert! If WriteFile(tmpdirlist[i] + "/filewritingtest") Then 'es konnte geschrieben werden! DeleteFile(tmpdirlist[i] + "/filewritingtest") Return tmpdirlist[i] End If End If Next Notify ("Auf dem vorliegenden Betriebssystem konnte~nkein Tmporäres Verzeichnis ermittelt werden,~nfür welches Schreibrechte bestehen.~nDas Programm wird abgebrochen.") End End Function |
||
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mist! ![]() Statt CreateProcess(TmpDir + "/program.app") muss es natürlich heißen: CreateProcess(TmpDir + "/program.app/Contents/MacOS/program") Der verkappte Ordner program.app lässt sich ja, wie oben erwähnt, nicht als ausführbare Datei behandeln. Diese Zeile also bitte noch im Code austauschen... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group