Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Too stupid to execute and wait (https://www.delphipraxis.net/162142-too-stupid-execute-wait.html)

QuickAndDirty 9. Aug 2011 09:14


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:
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;
Der Funktionsaufruf
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.

Luckie 9. Aug 2011 09:24

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.

QuickAndDirty 9. Aug 2011 09:47

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?

ChrisE 9. Aug 2011 09:52

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:
ShExecInfoA.lpVerb := 'open';
[/Edit]
[Edit2]
und das ist auch komisch:
Delphi-Quellcode:
ShExecInfoA.lpFile := PChar(AnsiString(Filename));
ShExecInfoA.lpParameters := PChar(AnsiString(Params));
ShExecInfoA.lpDirectory := PChar(AnsiString(ExtractFileDir(Filename)));
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:
[/Edit2]

sirius 9. Aug 2011 10:11

AW: Too stupid to execute and wait
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1115709)
Hallo,
ich bin zu doof einen Prozess zu aus der Anwendung zu startetn und zu warten bis er beendet ist.

Was heißt denn für dich "warten"? Was soll denn dein eigener Prozess in der Zwischenzeit tun?


Zitat:

der Prozessstartet und hängt dann! Er wird von WaitforSingleObject scheinbar blockiert.
Genau (its not a bug its a feature)! Deswegen heißt die Funktione ja auch ExecuteAndWait

Also, es sieht so aus, als ob alles so geschieht, wie es vom Autor gedacht war. Nur die Frage ist jetzt: Was willst du?

himitsu 9. Aug 2011 10:13

AW: Too stupid to execute and wait
 
Zitat:

Delphi-Quellcode:
else if GetLastError = ERROR_FILE_NOT_FOUND then
      Showmessage('Fehler beim Starten der Anwendung:' + Filename +
                   #13#10'System Fehler: ERROR_FILE_NOT_FOUND')
    else if GetLastError = ERROR_PATH_NOT_FOUND then
      Showmessage('Fehler beim Starten der Anwendung:' + Filename +
               #13#10'System Fehler: ERROR_PATH_NOT_FOUND')
    else if GetLastError = ERROR_DDE_FAIL then
...

Kennst du schon Delphi-Referenz durchsuchenSysErrorMessage oder Delphi-Referenz durchsuchenRaiseLastOSError?

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:

WaitForSingleObject
Schau dir mal Delay in der DP-CodeLib an, damit kann man in der aktiven Methode warten und die restliche GUI läuft dennoch weiter.
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.

QuickAndDirty 9. Aug 2011 10:13

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. :(

QuickAndDirty 9. Aug 2011 10:15

AW: Too stupid to execute and wait
 
Zitat:

Zitat von himitsu (Beitrag 1115720)
Zitat:

Delphi-Quellcode:
else if GetLastError = ERROR_FILE_NOT_FOUND then
      Showmessage('Fehler beim Starten der Anwendung:' + Filename +
                   #13#10'System Fehler: ERROR_FILE_NOT_FOUND')
    else if GetLastError = ERROR_PATH_NOT_FOUND then
      Showmessage('Fehler beim Starten der Anwendung:' + Filename +
               #13#10'System Fehler: ERROR_PATH_NOT_FOUND')
    else if GetLastError = ERROR_DDE_FAIL then
...

Kennst du schon Delphi-Referenz durchsuchenSysErrorMessage oder Delphi-Referenz durchsuchenRaiseLastOSError?

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)

Himitsu die Showmessages sind nur zum debuggen ^^

du hast also auch keine Idee warum es nicht geht ja?

himitsu 9. Aug 2011 10:18

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.

QuickAndDirty 9. Aug 2011 10:22

AW: Too stupid to execute and wait
 
Zitat:

Zitat von ChrisE (Beitrag 1115715)
Hallo QAD,

ich denke mal du nutzt Delphi > 2007.

ja 2007.

Zitat:

Zitat von ChrisE (Beitrag 1115715)
Wenn das der Fall ist dann solltest du darauf achten, dass du WideString und AnsiString nicht vermischst :-)

Gruß, Chris

Ok, danke. Habe das korrigiert...
Scheint das problem aber nicht zu beheben kann das sein?

Zitat:

Zitat von ChrisE (Beitrag 1115715)
[Edit]siehe
Delphi-Quellcode:
ShExecInfoA.lpVerb := 'open';
[/Edit]

was ist damit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.
Seite 1 von 5  1 23     Letzte »    

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