Incbin eingebundene Anwendung starten

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

BlitzMoritz

Betreff: Incbin eingebundene Anwendung starten

BeitragSo, Feb 03, 2008 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragSo, Feb 03, 2008 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 03, 2008 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Blitzcoder

Newsposter

BeitragSo, Feb 03, 2008 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
 

#Reaper

Newsposter

BeitragSo, Feb 03, 2008 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Blitzcoder

Newsposter

BeitragSo, Feb 03, 2008 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 03, 2008 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für Eure Tipps.
Das Schreiben auf Festplatte wollte ich eigentlich vermeiden, aber anders geht's wohl nicht. Sad
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? Question
 

Dreamora

BeitragSo, Feb 03, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 03, 2008 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 03, 2008 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bitte um Entschuldigung, aber mein bisheriges Wissen ist noch stark begrenzt: Rolling Eyes
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

BeitragSo, Feb 03, 2008 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Feb 04, 2008 0:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie cool! Cool Jetzt verstehe ich erst, was für mächtige Möglichkeiten in "System_()" stecken.
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

BeitragMo, Feb 04, 2008 1:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile )
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

BeitragMo, Feb 04, 2008 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
C:/WINDOWS/Temp ist natürlich naiv Embarassed
Ü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

BeitragMo, Feb 04, 2008 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 05, 2008 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 05, 2008 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 09, 2008 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 16, 2008 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 16, 2008 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Mist! Mad Mir ist noch ein kleiner Fehler unterlaufen:
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...

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group