AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Too stupid to execute and wait

Ein Thema von QuickAndDirty · begonnen am 9. Aug 2011 · letzter Beitrag vom 10. Aug 2011
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.927 Beiträge
 
Delphi 12 Athens
 
#1

Too stupid to execute and wait

  Alt 9. Aug 2011, 10:14
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
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.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 9. Aug 2011 um 11:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 10:24
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.927 Beiträge
 
Delphi 12 Athens
 
#3

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 10:47
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 9. Aug 2011 um 11:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 10:52
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 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
[/Edit2]
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules

Geändert von ChrisE ( 9. Aug 2011 um 11:02 Uhr) Grund: siehe Edit
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 11:11
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?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#6

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 11:13
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.


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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Aug 2011 um 11:16 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.927 Beiträge
 
Delphi 12 Athens
 
#7

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 11:13
@Luckie:
Als Goody extra für dich Case of reingebaut...

Ist tatsächlich augenfreundlicher...funktioniert aber auch nicht besser.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.927 Beiträge
 
Delphi 12 Athens
 
#8

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 11:15
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.


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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#9

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 11:18
Auch mit SysErrorMessage und Co. kann man debuggen.

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Aug 2011 um 11:22 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.927 Beiträge
 
Delphi 12 Athens
 
#10

AW: Too stupid to execute and wait

  Alt 9. Aug 2011, 11:22
Hallo QAD,

ich denke mal du nutzt Delphi > 2007.
ja 2007.

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?

[Edit]siehe ShExecInfoA.lpVerb := 'open'; [/Edit]
was ist damit?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz