![]() |
Too stupid to execute and wait
Hallo,
ich bin zu doof einen Prozess zu aus der Anwendung zu startetn und zu warten bis er beendet ist. Ich nutze eine modifizierte Version aus der Code lib von EexecAndWait um den Prozess auf zu rufen...aber es ging auch vor den Modifizierungen nicht habe die eingebaut um herauszufinden was da passiert...bzw. um das Ergebniss zu verbessern...erfolglos! Das verhalten ist wie folgt... der Prozessstartet und hängt dann! Er wird von WaitforSingleObject scheinbar blockiert. Weiter als bis zum Splahscreen kommt er nicht. Erst wenn ich den startenden prozess beende läuft der gestartetet Prozess durch. Das ist nicht das Verhalten was ich mir wünsche. Hier der Code zum starten und warten. Das Programm heißt SFX.exe
Delphi-Quellcode:
Der Funktionsaufruf
function ExecAndWait(Filename, Params: string; WindowState: word = SW_SHOWNORMAL): boolean;
var ShExecInfo: SHELLEXECUTEINFO; r : Cardinal; const SEE_MASK_NOASYNC= $100; begin Result := false; if Filename = '' then exit; if not FileExists(FileName) then Begin ShowMessage('Datei nicht existent!'); Exit; End; ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo)); ShExecInfo.Wnd := application.MainFormHandle; //GetForegroundWindow; ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFOA); ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC; ShExecInfo.lpVerb := 'open'; ShExecInfo.lpFile := PChar(Filename); ShExecInfo.lpParameters := PChar(Params); ShExecInfo.lpDirectory := PChar(ExtractFileDir(Filename)); ShExecInfo.nShow := WindowState; Result := ShellExecuteEx(@ShExecInfo); try if Result then r := WaitForSingleObject(ShExecInfo.hProcess, INFINITE) else Showmessage('Fehler beim Starten der Anwendung:' + Filename + #13#10'System Fehler: ' + SysErrorMessage(GetLastError)); finally CloseHandle(ShExecInfo.hProcess); end; end;
Delphi-Quellcode:
ExecAndWait(inspath+'\SETUP.EXE','');
Das aufgerufene Programm ist ein Setup.exe ^^ sieht so aus.
Delphi-Quellcode:
program Setup;
uses dialogs, SysUtils, Forms, fmainf; {$R *.RES} begin SplashForm := TSplashForm.Create(Application); SplashForm.Show; SplashForm.Update; Application.ProcessMessages; Application.Title := 'Setup'; Application.HelpFile := 'SETUP.chm';//A.R.DB //Hier würde ein Showmessage noch angezeigt Application.CreateForm(TFmainf, Fmainf); // Er kommt nur bis hierhin....dann wartet er auf das ende der sfx.exe....total dämlich //Hier würde ein Showmessage nicht mehr angezeigt SplashForm.Hide; SplashForm.Free; Application.Run; end. |
AW: Too stupid to execute and wait
Der Code ist ja grausam. Willst du uns irgendwie quälen? Der Ressourcenschutzblock sitzt an der falschen Stelle, bei der Fehlerbehandlung hast du mehrfach doppelten Code und mit einem case wäre das ganze wesentlich übersichtlicher.
|
AW: Too stupid to execute and wait
Ich habe die ExecuteAndWait einfach übernommen und dann so lange vergewaltigt bis sie mir sagt warums sie nicht funktioniert....das ist nicht als bleibender Code gedacht....
try finaly kann nicht wo anders hin so weit ich das sehe. könntest du dennoch was zum thema sagen? |
AW: Too stupid to execute and wait
Hallo QAD,
ich denke mal du nutzt Delphi > 2007. Wenn das der Fall ist dann solltest du darauf achten, dass du WideString und AnsiString nicht vermischst :-) Gruß, Chris [Edit]siehe
Delphi-Quellcode:
[/Edit]
ShExecInfoA.lpVerb := 'open';
[Edit2] und das ist auch komisch:
Delphi-Quellcode:
Ein WideString z.b FileName wird zu nem AnsiString gecastet und dann wird doch wieder nen PChar draus gemacht und einer Struktur übergeben die Ansi als Index trägt :gruebel:
ShExecInfoA.lpFile := PChar(AnsiString(Filename));
ShExecInfoA.lpParameters := PChar(AnsiString(Params)); ShExecInfoA.lpDirectory := PChar(AnsiString(ExtractFileDir(Filename))); [/Edit2] |
AW: Too stupid to execute and wait
Zitat:
Zitat:
Also, es sieht so aus, als ob alles so geschieht, wie es vom Autor gedacht war. Nur die Frage ist jetzt: Was willst du? |
AW: Too stupid to execute and wait
Zitat:
![]() ![]() PS: Bei einem dir unbekannten Fehler oder bei neuen Fehler in neueren Windowsen, wird bei dir niemals ein Fehler angezeigt. :shock: Abgesehn davon ist es bei solchen "Funktionen" nicht schöön, wenn Fehler mit ShowMessage und Co. angezeigt werden, denn was wäre, wenn ich in meinem Programm solche Fehler über abfangen möchte, ohne daß etwas angezeigt wird? (z.B. ein externes Try-Except, was bei ShowMessage aber nicht geht) Zitat:
Oder man lagert das aktuelle ExecAndWait in einen Thread aus, da bleibt dann nur der Thread "hängen" und der GUI-Thread kann problemlos weiterarbeiten. |
AW: Too stupid to execute and wait
@Luckie:
Als Goody extra für dich Case of reingebaut... Ist tatsächlich augenfreundlicher...funktioniert aber auch nicht besser. :( |
AW: Too stupid to execute and wait
Zitat:
du hast also auch keine Idee warum es nicht geht ja? |
AW: Too stupid to execute and wait
Auch mit SysErrorMessage und Co. kann man debuggen. :roll:
Und siehe mein Edit im letzen Post. wie schon jemand sagte: - bei ShExecInfoA, SHELLEXECUTEINFOA und ShellExecuteExA das A weg - WideString zu String - die AnsiString-Casts raus Wer sagt, daß das ForegroundWindow zu deinem Prozess gehört? ... Keiner, also kannst du da doch nicht einfach was dranhängen. |
AW: Too stupid to execute and wait
Zitat:
Zitat:
Scheint das problem aber nicht zu beheben kann das sein? Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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