anderes Programm mit Commandline starten?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Midimaster

Betreff: anderes Programm mit Commandline starten?

BeitragMo, Sep 26, 2011 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hilfe, ich komme alleine nicht weiter....

Wie kann ich von BMax aus ein anderes Programm starten und danach das eigene beenden?

Es geht um eine Auto-Update-Funktion. Das Programm soll erst sein eigenes Update vom Server holen, dann selbst neu hochfahren.

Lösen wollte ich das so: "Spiel.Exe" holt Update auf Festplatte unter "spiel.bin". Dann startet es "Restart.Exe". Dieses kopiert "spiel.bin" auf Spiel.exe" und startet wieder "Spiel.Exe". Das Ganze unter WIN-7 und OsX.

mein Versuch bisher:
BlitzMax: [AUSKLAPPEN]
'in der Spiel.exe:
Function NeuStarten()
Local process:TProcess=CreateProcess("Restart.exe -Spiel.Exe")
TProcess.ProcessList.Remove process
End Function


hiermit startet zwar die Restart.Exe und die Spiel.Exe wird beendet, aber es kommt das Argument erst gar nicht bei "Restart.Exe" an. Was mache ich falsch?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Der Eisvogel

BeitragMo, Sep 26, 2011 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, bei mir gibt es die Funktion CreateProcess garnicht. Ich nehme mal an du hast dazu ein Modul gefunden. Das bräuchte man um dir da Rat geben zu können. Ansonsten würde ich für Windows ShellExecute vorschlagen, jedoch denke ich mal du brauchst das Plattformunabhängig.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

Shaman

BeitragMo, Sep 26, 2011 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hatte mal ein ähnliches problem und hab das mit folgenden Code gelöst:
(Erweiterung eines Codes aus dem Codearchiv) :
Code: [AUSKLAPPEN]

Function ExecFileEx(cmd:String,args:String,path:String=":TempDir")
   If(Right(cmd, 1) = "\" Or Right(cmd, 1) = "/") Then cmd = Mid(cmd, 1, Len(cmd) - 1)
   
   If(FileType(cmd) = 2) Then
         OpenURL(cmd)
         Return
   EndIf

   ' ---> URL ausschließen ( Sonst mit dem Browser öffnen)
      Select(Lower(Left(cmd, 4)))
         Case("www.")
            OpenURL(cmd)
               Return
         
      Case("http")
            If(Lower(Left(cmd, 5)) = "http:" Or Lower(Left(cmd, 5)) = "https:") Then
                    OpenURL(cmd)
                    Return
               EndIf
      End Select

   ' -- Die Datei öffnen
   If path=":TempDir" Then path=getenv_("temp")
   If FileType(path+"\ExecFile.bat")=1 Then DeleteFile(path+"\ExecFile.bat")
   Local temp:TStream=WriteFile(path+"\ExecFile.bat")
      WriteLine(temp, "@ECHO off")
      WriteLine(temp, "call "+Chr(34) + cmd + Chr(34) + " " + args)
   temp.Close
   
   __ExecFile(path+"\ExecFile.bat")
End Function

Hier wird eine .bat-Datei erstellt, welche dann das Programm+Parameter (indirekt) aufruft.
Dadurch läuft das normale Programm weiter, beziehungsweise in deinem Fall wird es beendet.
Wenn es ein relativer Pfad ist, kannst du auch den Speicherort der .bat ändern (sonst im temporären verzeichnis).


Die __ExecFile ist in 'helpers.c' definiert:
Code: [AUSKLAPPEN]

void __ExecFile(char *cmd)
{
 system(cmd);
}

unter OsX musst du halt die helpers.c verändern.

Vielleicht hilft dir diese Funktion.

BtbN

BeitragMo, Sep 26, 2011 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum nimmst du nicht einfach system_ aus Pub.StdC?
Davon abgesehen würde das wo anders als unter Windows so eh nicht funktionieren, weils da keine bat dateien gibt, was aber egal ist, da man zumindest unter Linux ohne rücksicht sein eigenes binary überschreiben kann. Vermute einfach mal, dass das unter OSX auch geht.

BladeRunner

Moderator

BeitragMo, Sep 26, 2011 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
... da war ich im Suchen zu lahm, auch ich hätte system_ vorgeschlagen.
Ab davon: Eisvogel, CreateProcess befindet sich in Pub.FreeProcess - und ist damit Bestandteil der Standardinstallation von BMax.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Der Eisvogel

BeitragMo, Sep 26, 2011 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, tut mir leid. Bei mir wird der Befehl weder von BLIde noch vom Compiler erkannt. Ich bekomme immer eine Fehlermeldung "Identifer not found". Wenn ich das MOD aber selbst mittels Import einbinde, funktioniert es.
Jetzt ab ich wieder was gelernt.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Midimaster

BeitragDi, Sep 27, 2011 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@BladerRunner & Btbn

System_() habe ich auch schon probiert. Hier habe ich das Problem, dass die erste Anwendung Spiel.Exe nicht endet. BlitzMax wartet bei diesem Befehl. Und dann läßt sich in der Restart.Exe die Datei Spiel.Exe nicht durch ihr eigenes Update überschreiben.

@Shaman
vielen Dank. Ich hoffe aber immer noch, dass ich um einen Work-Around herumkomme... Außerdem wären dann für OsX noch ein zweiter Trick notwending.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

BladeRunner

Moderator

BeitragDi, Sep 27, 2011 8:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, es verwundert mich dass Du die Argumente nicht erhälst, ich habe grade einen alten Code von mir ausgegraben der eine C64-Floppy per OpenCBM ansteuert und da funktioniert es mit createprocess problemfrei. Kann es sein dass dein Code zum Auslesen der Argumente fehlerhaft ist?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragDi, Sep 27, 2011 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
das habe ich auch schon ausprobiert. Wenn ich die Restart.Exe von der IDE aus starte und in der IDE etwas bei Command Line einfüge, kommen die Argumente an.

Empfänger-Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict
'Framework brl.basic
'Import brl.tprocess '???
'Import BaH.Volumes

Graphics 300,200

Print "Number of Args:" + AppArgs.length

For Local cmd:String = EachIn AppArgs
Print "ARGS: !" + cmd + "!"
Next

Print AppDir
'...


Bei der Gelegenheit kann ich dann jetzt ja auch mal gleich fragen, ob jemand weiß, wie das Import-Modul für den Befehl Process() heißt. Ich würde hier gerne mit einem Framework arbeiten.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Holzchopf

Meisterpacker

BeitragDi, Sep 27, 2011 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
PUB.FreeProcess

(Das müsste eigentlich jeweils auch in der Hilfe stehen, wenn du in der IDE ein Befehl, hier CreateProcess, mit 2x F1-Drücken aufrufst.)

Edit
Hier mal ein kleines funktionierendes Minimalbeispiel. Es unterscheidet sich von deinem eigentlich nur in der Anwendung von Print, die bei mir partout nicht hinhauen will:

Das Programm, das das andere Programm startet, BlitzMax: [AUSKLAPPEN]
SuperStrict

Local process:TProcess = CreateProcess("printcommandline.exe -piff -paff -flubber")
If process Then
Print "process started"
TProcess.ProcessList.Remove process
EndIf


Das andere Programm, BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics 300,200

DrawText "Number of arguments: "+AppArgs.length,0,0

Local y:Int=15
For Local arg:String = EachIn AppArgs
DrawText arg,0,y
y:+15
Next

Flip
WaitKey()

End
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Midimaster

BeitragDi, Sep 27, 2011 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Fettes Bussi! Very Happy

Es ist so wie Du schreibst: Der PRINT geht da nicht! Mit DrawText geht es auch bei mir! Das hat die ganze Zeit funktioniert, nur wurde es nicht angezeigt.

Vielen lieben Dank! Da muss man erst mal draufkommen!

Danke auch für den Tipp mit den Modulquellen. Ich hab gleich in der Anleitung nachgesehen. Tatsächlich steht immer ganz oben im Dokument die BRL.xxx aus der ein entsprechender Befehle kommt.

Allerding ist bei mir CreateProcess() schon mal gleich gar nicht farbig als "bekannter Befehl" hinterlegt und in der rechten Help-Baumstruktur nicht aufgeführt. F1 nutzt da nix... Ist das normal?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Holzchopf

Meisterpacker

BeitragDi, Sep 27, 2011 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, das ist nicht normal Confused Mach mal "Rebuild Documentation" (oben unter Tools).

Tipp: Die IDE vorher 2x mal öffnen, dann in der zweiten die Docs rebuilden, diese danach wieder zuerst schliessen, dann die erste schliessen. Dann kannst du sie wieder öffnen und hast sowohl die neue Doc als auch den herkömmlichen Workspace (mach ich immer so, weil BMax vor lauter Unwissenheit meint, beim Rebuilden müssten sämtliche Dokumente geschlossen werden *grossesaugenrollen*).

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Midimaster

BeitragDi, Sep 27, 2011 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat leider nichts gebracht. Der CreateProcess() bleibt grau. Sonderbar!


zum alten Fehler:
Noch mysteriöser: Ich habe den Text in meiner RESTART.BMX so abgeändert, dass er deinem Beispiel 1:1 glich... Aber es hat trotzdem nicht funktioniert. Ich musste eine völlig neue RESTART3.BMX anlegen und alle benötigten Zeilen aus beiden Quellen einfügen. Damit geht es jetzt.

ach so'ne Community is schon was schönes Very Happy
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Di, Sep 27, 2011 19:22, insgesamt einmal bearbeitet

blackgecko

BeitragDi, Sep 27, 2011 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Module pub.freeprocess ist kein bisschen dokumentiert, es ist also schon normal, dass nichts gehighlighted wird.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group