![]() |
Exe aufrufen und Rückgabewert auswerten
Ich möchte gerne aus einer Exe-A eine Exe-B aufrufen. Exe-A wartet dann auf beendigung von Exe-B.
Kann Exe-B bei Beendigung der Exe-A irgendeine Art Rückgabewert mitteilen? Exe-B führt eine Aktion aus und Exe-A will dann wissen, ob die erfolgreich war. |
AW: Exe aufrufen und Rückgabewert auswerten
Versuche es mal mit WM_COPYDATA
|
AW: Exe aufrufen und Rückgabewert auswerten
Ich glaube das würde nicht passen.
Pseudicode: if RufeExeBAuf(parameter1, parameter2) then begin end; Schon dort brauche ich die Rückgabe von Exe-B. Wenn ich Wm-CopyData nutze, bin ich ja erst einmal wieder ganz woanders und muss mich wieder an diese Stelle hangeln. |
AW: Exe aufrufen und Rückgabewert auswerten
Zitat:
Wird die Anwendung B aufgerufen dann schickt diese über WM_COPYDATA deine Informationen direkt zu A. Das ist doch was du willst. War nur ein Vorschlag. |
AW: Exe aufrufen und Rückgabewert auswerten
Im Prinzip schon. Aber ich dachte das kann man direkt über ShellExecuteExW() regeln könnte.
Exe-A ruft ShellExecuteExW auf und wartet ja auf einen Boolean-Rückgabewert. Ich dachte da kann man aus Exe-B irgendwas raus senden. |
AW: Exe aufrufen und Rückgabewert auswerten
Sind das beides Deine Programme? Konsole oder UI?
|
AW: Exe aufrufen und Rückgabewert auswerten
Beides meine Programme. Exe-A mit GUI, Exe-B ist kein Konsolenprogramm ({$APPTYPE CONSOLE} nicht gesetzt), hat aber keine Formulare. Alles findet in der DPR statt.
|
AW: Exe aufrufen und Rückgabewert auswerten
Zitat:
die Rückgabe für ShellExecuteExW ist Bool gibt aber nur zurück ob der Aufruf erfolgreich war. Beispiel: Für ShellExecute
Delphi-Quellcode:
Function ShellExecuteErrMessage(int_Code: INTEGER): STRING;
//Gibt die passenede Fehlermeldung zum ShellExecute Fehlercode zurück Begin CASE int_code OF 0: result := 'Zuwenig Speicher, ausführbare Datei war zerstört, Relokationswerte waren ungültig'; 2: result := 'Datei wurde nicht gefunden.'; 3: result := 'Verzeichnis wurde nicht gefunden.'; 5: result := 'Fehler beim gemeinsamen Zugriff auf eine Datei im Netz oder Fehler beim Zugriff auf eine gesperrte Datei im Netz.'; 6: result := 'Bibliothek forderte separate Datensegmente für jede Task an.'; 8: result := 'Zuwenig Speicher, um die Anwendung zu starten.'; 10: result := 'Falsche Windows-Version.'; 11: result := 'Ungültige ausführbare Datei. Entweder keine Windows-Anwendung oder Fehler in der EXE-Datei.'; 12: result := 'Anwendung für ein anderes Betriebssystem.'; 13: result := 'Anwendung für MS-DOS 4.0.'; 14: result := 'Typ der ausführbaren Datei unbekannt.'; 15: result := 'Versuch, eine Real-Mode-Anwendung (für eine frühere Windows-Version) zu laden.'; 16: result := 'Versuch, eine zweite Instanz einer ausführbaren Datei mit mehreren Datensegmenten die nicht als nur lesbar gekennzeichnet waren, zu laden.'; 19: result := 'Versuch, eine komprimierte ausführbare Datei zu laden.' + #13 + 'Die Datei muß dekomprimiert werden, bevor sie geladen werden kann.'; 20: result := 'Ungültige dynamische Linkbibliothek (DLL).' + #13 + 'Eine der DLLs, die benötigt wurde, um die Anwendung auszuführen, war beschädigt.'; ELSE result := 'Ein Unbekannter Fehler ist aufgetreten. (' + IntToStr(int_code) + ')'; END; End;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Err: Integer; begin Err:= ShellExecute(0, Nil, PChar('C:\Programm.exe'), Pchar('-Parameter'), Pchar('C:\StartDir'), SW_NORMAL); if Err<>0 then Showmessage(ShellExecuteErrMessage(Err)); end; Zitat:
|
AW: Exe aufrufen und Rückgabewert auswerten
An meinem ShellExecuteExW-Aufruf in dieser Unit kann ich nix ändern, das würde mir 5 oder 6 andere Programme zerschießen.
|
AW: Exe aufrufen und Rückgabewert auswerten
Dann könntest Du doch in beiden Programmen mit RegisterWindowsMessage eine eigene Message erzeugen, die Programm B an Programm A sendet, sobald das Ergebnis feststeht. Entweder gibt dann Programm A ein Fensterhandle (Application.Mainform.Handle z.B.) als Kommandoparameter an Programm B mit, oder dieses sendet einfach an HWND_BROADCAST.
|
AW: Exe aufrufen und Rückgabewert auswerten
Könntest du mir davon ein Beispiel schicken? Davon verstehe ich gerade überhaupt nichts.
Was wm-copydata angeht, könnte das eventuell so bei mir funktionieren: - ExeA ruft ExeB auf - ExeA wartet auf Beendigung von ExeB - während ExeB noch läuft, schicke ich per wm-copydata was an ExeA. Dort wird eine Variable mit irgendwas gefüllt. - sobald ExeB beendet ist, gehts in ExeA weiter und dort könnte ich die variable auswerten. Könnte klappen :roll: |
AW: Exe aufrufen und Rückgabewert auswerten
Im Moment nicht, da ich am Tablet schreibe. Aber RegisterWindowMessage nimmt als Parameter einen PChar auf einen möglichst eindeutigen String entgegen und gibt eine systemweit eindeutige Message-ID zurück. Das eignet sich meiner Meinung nach prima für Dein Anliegen.
|
AW: Exe aufrufen und Rückgabewert auswerten
Zitat:
Lege dir einfach eine Message an die du in beiden Anwendungen definierst. |
AW: Exe aufrufen und Rückgabewert auswerten
Habe das jetzt so gelöst, da ich eh schon einen Handler für WmCopyData im Programm habe.
ExeB
Delphi-Quellcode:
ExeA
var
hExistingInstance: THandle; pName: PChar; aCopyData: TCopyDataStruct; procedure SendRecord(const aRecordToSend: TCopyDataStruct); begin aCopyData.dwData := ... irgendein int wert, max cardinal; SendMessage(hExistingInstance, WM_COPYDATA, 0, LPARAM(@aCopyData)); end; procedure SendReturnCode(const ReturnString: string); begin pName := PChar(ReturnString); aCopyData.cbData := (StrLen(pName) + 1) * SizeOf(PWideChar); aCopyData.lpData := pName; SendRecord(aCopyData); end; hExistingInstance := FindWindow(PChar('TFormBlubb'), nil); if (hExistingInstance = 0) then SendReturnCode('NixOK') else SendReturnCode('AllesOK');
Delphi-Quellcode:
private
{Private-Deklarationen} procedure WMCopyData(var msg: TWMCopyData); message WM_COPYDATA; procedure TFormBlubb.WMCopyData(var msg: TWMCopyData); begin if msg.CopyDataStruct.dwData = TProgramMeta.iUniqueMutexID then Blubb(msg, TParameterType.ptNull) else inherited; end; procedure Blubb(const ParameterList: string; const aParameterType: TParameterType); begin showmessage(ParameterList); end; |
AW: Exe aufrufen und Rückgabewert auswerten
Wenn man
![]() ![]() ![]() Grüße Dalai |
AW: Exe aufrufen und Rückgabewert auswerten
Stichwort: IPC
da gibt es tausende Möglicheiten. Mailslots SharedMemory (MMF, GlobalAlloc, .........) Pipes (Named oder Unnamed) / Streams Sockets (TPC/UDP) TempFiles ... |
AW: Exe aufrufen und Rückgabewert auswerten
Zitat:
![]()
Delphi-Quellcode:
Exitcode := 42;
|
AW: Exe aufrufen und Rückgabewert auswerten
Hallo,
ProgrammB setzt den Exitcode ( ![]() Wie man das jetzt auswertet, finde ich nicht wirklich im Netz, vielleicht ja so ![]() |
AW: Exe aufrufen und Rückgabewert auswerten
Das müsste eigentlich mit CreatPipe(...) und CreapeProcess(...) gehen, oder mit der Komponente "DosCommand" (in GetIt).
|
AW: Exe aufrufen und Rückgabewert auswerten
Doofe Frage: Warum muss es ein extra Programm sein, wenn es keine Formulare anzeigt?
Wäre da nicht ein Thread sinniger? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz