Seite 1 von 1
Parameter von aufgerufenem Programm zurückgeben?
Verfasst: 23.02.2006 19:27
von Zomtec
Hallo Leute,
gibt's eine einfache Möglichkeit, Parameter von einem aufgerufenen Programm (beides PB-Programme) zurückzugeben?
Also vom Hauptrogramm Programm2 aufrufen und die Rückgabe in einen String bekommen z. B. so in der Art:
Code: Alles auswählen
If RunProgram("Programm2", Parameter$, "") : endif
rueckgabe$=???
Verfasst: 24.02.2006 00:33
von benpicco
Naja, du kannst mit End exitcodes angeben, z.b. end 123, damit jedoch ganze strings zu übergeben ist aber problematisch, ich weiß nicht ob´s geht, aber villeicht kannst du ja den Pointer auf einen string übergeben(mit @deinstring.s), den string kannst du dann ganz einfach mit PeekS(pPointerzumString) auslesen.
edit:
Ich hab mal etwas rumprobiert, aber hiermit hat´s schonmal micht funktioniert...
test.exe:
Code: Alles auswählen
param$=ProgramParameter()
*pMem=GlobalAlloc_(#GMEM_SHARE,Len(param$)+1)
CopyMemory(@param$,*pMem,Len(param$))
End *pMem
anderesprogramm:
Code: Alles auswählen
NewList StartupInfo.STARTUPINFO()
NewList ProcInfo.PROCESS_INFORMATION()
AddElement(StartupInfo())
AddElement(ProcInfo())
If CreateProcess_("test.exe","test.exe testparameter",0,0,0,0,0,".",@StartupInfo(),@ProcInfo())
Delay(200)
code.l
GetExitCodeProcess_(ProcInfo()\hProcess,@code)
Debug GlobalSize_(code)
Debug PeekS(code)
GlobalFree_(code)
EndIf
Mir kommt´s fast so vor, als gibt PB den speicher wieder frei, wen man end aufruft, dabei hab ich ihn doch extra global angefordert...

Verfasst: 24.02.2006 15:06
von Macros
Aber man konnte den String doch in den Speicher schreiben (wenn er kurz ist),
mit Peekl() auslesen, das als Exitcode setzen, dann beim Anderen Programm
wieder in Speicher und mit PeekS() auslesen.
Verfasst: 24.02.2006 15:09
von Andre
In PB v4 gibts die Process Lib dafür.
Da sollte das z.B. auch über Umgebungsvariablen gehen.
Verfasst: 24.02.2006 17:08
von Zomtec
Danke für eure Antworten. Habe jetzt was in der PBOSL gefunden, das meiner gesuchten Funktion entsprechen könnte:
PBOSL_AllocateMemoryGlobal(Name.s, Size.l)
Parameters:
Name.s = Name des Speciherbereichs als String, Handle
Size.l = Größe des Speicherbereichs in Bytes
Return Values: The memory-adress
Description: Gibt den Zeiger auf den Speicherbereich zurück (wie in PB-Funktion Allocatememory)
Habe es mangels Zeit bisher leider noch nicht testen können. Der Exitcode wird doch an die Windowsvariable %errorlevel% übergeben. Lässt sich diese so einfach von einem Windowsprogramm auslesen?
Verfasst: 24.02.2006 19:21
von benpicco
Umgebungsvariablen kannst du ganz einfach mit
Code: Alles auswählen
variable.s="SystemDrive"
Inhalt.s=Space(#MAX_PATH)
GetEnvironmentVariable_(variable,@Inhalt,#MAX_PATH)
Debug Inhalt
abfragen.
Verfasst: 24.02.2006 19:31
von ts-soft
Aber mit dem ERRORLEVEL wird das in PB3.94 wahrscheinlich nicht funzen.
In PB4 wird sowas aber von Hause aus unterstützt. Auch das setzen. Wenn
man seine eigenen Variablen vor RunProgramm() setzt, sind diese im
anderem Programm auch ermittelbar.
Verfasst: 24.02.2006 21:45
von benpicco
Wenn die beiden Programme miteinander komunizieren sollen, ist es villeicht einfacher und schneller die nachrichten übers (lokale) Netzwerk zu schicken, das eine Programm ist dan der Client, das andere der Server.