Delphi-PRAXiS
Seite 2 von 5     12 34     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 10:24

AW: Too stupid to execute and wait
 
Zitat:

Zitat von himitsu (Beitrag 1115724)
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.

Ok. wie gesagt habe es kopiert weil ich mal schnell was brauchte... und mit Kommandline programmen ging es auch.

Ich bin in sachen Windows API relativ unbeleckt! Und hoffte eigentlich was fertiges zu finden was einfach einen Prozess startet und wartet bis er fertig ist! Der code hat mit Kommandlinetools auch super hingehauen.
(gsecexe, Isql.exe)

QuickAndDirty 9. Aug 2011 10:31

AW: Too stupid to execute and wait
 
Zitat:

Zitat von sirius (Beitrag 1115719)
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?

Na nichts? gucken wann er weiter machen darf, er muss nicht mal auf User input reagieren können ...wäre aber schön.

Zitat:

Zitat von sirius (Beitrag 1115719)
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?

sfx.exe startet Setup.exe und setup.exe hängt dann im splashscreen und sfx.exe hängt im Waitforsingleobject. (Ein deadlock)
Ich will das NUR sfx.exe im Waitforsingleobject hängt aber nicht setup.exe im splashscreen.

QuickAndDirty 9. Aug 2011 10:41

AW: Too stupid to execute and wait
 
Änderungen eingebaut...wie zu erwarten selbes problem...
änderungen im startpost veröffentlicht.


WaitForSingleObject wartet bis das Prozesshandle ungültig wird oder?

Wieso hängt der überwachte Prozess wenn er überwacht wird?

Luckie 9. Aug 2011 10:41

AW: Too stupid to execute and wait
 
Funktioniert wunderbar:
Delphi-Quellcode:
uses
  ShellAPI;

procedure ExecAndWait(Filename, Params: Widestring; WindowState: word = SW_SHOWNORMAL);
var
  ShExecInfo: SHELLEXECUTEINFOW;
const
  SEE_MASK_NOASYNC= $100;
begin
  ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
  ShExecInfo.Wnd := GetForegroundWindow;
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFOW);
  ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
  ShExecInfo.lpVerb := 'open';
  ShExecInfo.lpFile := PWideChar(Filename);
  ShExecInfo.lpParameters := PWideChar(Params);
  ShExecInfo.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename)));
  ShExecInfo.nShow := WindowState;
  if ShellExecuteExW(@ShExecInfo) then
  begin
    WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
    CloseHandle(ShExecInfo.hProcess);
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    ExecAndWait('C:\Windows\Notepad.exe', '');
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
  ShowMessage('Fertig');
end;

ChrisE 9. Aug 2011 10:46

AW: Too stupid to execute and wait
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1115726)
Zitat:

Zitat von ChrisE (Beitrag 1115715)
Hallo QAD,

ich denke mal du nutzt Delphi > 2007.

ja 2007.

Also = 2007 nicht größer --> bei Deiner Entwicklungsumgebung ist AnsiString = String und PChar = PAnsiChar -> somit ein Schönheitsfehler im Code.

Zitat:

Zitat von QuickAndDirty (Beitrag 1115726)
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?

OK - siehe oben

Zitat:

Zitat von QuickAndDirty (Beitrag 1115726)
Zitat:

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

was ist damit?

Hättest du größer 2007 wäre String = WideString. Das gilt auch für Stringkonstanten wie
Delphi-Quellcode:
'open'
. Diesen WideString würdest du an eine Struktur übergeben die für AnsiString gedacht ist. Das wäre ein potenzieller Fehler.

Warum dein aufgerufenes Programm trotzdem hängt weiß ich nicht. Das ist komisch.

Funktioniert der Code mit notepad - bzw. einem Programm dass du nicht selber geschrieben hast? (siehe Luckie)

Gruß, Chris

QuickAndDirty 9. Aug 2011 10:51

AW: Too stupid to execute and wait
 
Zitat:

Zitat von Luckie (Beitrag 1115732)
Funktioniert wunderbar:
Delphi-Quellcode:
uses
  ShellAPI;

procedure ExecAndWait(Filename, Params: Widestring; WindowState: word = SW_SHOWNORMAL);
var
  ShExecInfo: SHELLEXECUTEINFOW;
const
  SEE_MASK_NOASYNC= $100;
begin
  ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
  ShExecInfo.Wnd := GetForegroundWindow;
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFOW);
  ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
  ShExecInfo.lpVerb := 'open';
  ShExecInfo.lpFile := PWideChar(Filename);
  ShExecInfo.lpParameters := PWideChar(Params);
  ShExecInfo.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename)));
  ShExecInfo.nShow := WindowState;
  if ShellExecuteExW(@ShExecInfo) then
  begin
    WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
    CloseHandle(ShExecInfo.hProcess);
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    ExecAndWait('C:\Windows\Notepad.exe', '');
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
  ShowMessage('Fertig');
end;

Ja mit notepad funktioniert es wunderbar,
mit isql.exe geht es und mit gsec.exe geht es auch

Aber mit meiner setup.exe ist nach dem Splashscreen Schluss.
Warum?

QuickAndDirty 9. Aug 2011 10:53

AW: Too stupid to execute and wait
 
Zitat:

Zitat von ChrisE (Beitrag 1115733)
Warum dein aufgerufenes Programm trotzdem hängt weiß ich nicht. Das ist komisch.

sehe ich auch so...
Zitat:

Zitat von ChrisE (Beitrag 1115733)
Funktioniert der Code mit notepad - bzw. einem Programm dass du nicht selber geschrieben hast? (siehe Luckie)

Gruß, Chris

ja mit ISQL.exe, gsec.exe, notepad.exe....

hat jemand ne idee warum er bei setup.exe nur bis zum splashscreen kommt??

ChrisE 9. Aug 2011 10:56

AW: Too stupid to execute and wait
 
Zitat:

Zitat von Luckie (Beitrag 1115732)
Funktioniert wunderbar:

Hmm, du mischst aber auch WideString und AnsiString bzw. gibst es nicht explizit an.
Delphi-Quellcode:
  ShExecInfo.lpVerb := 'open';
Ich würde es so versuchen (Deine Sourcen angepasst):
Delphi-Quellcode:
uses
  ShellAPI;

procedure ExecAndWait(Filename, Params: string; AHWnd: HWND; WindowState: word = SW_SHOWNORMAL);
var
  ShExecInfo: SHELLEXECUTEINFO;
const
  SEE_MASK_NOASYNC= $100;
begin
  ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
  ShExecInfo.Wnd := AHWnd;
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
  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;
  if ShellExecuteExW(@ShExecInfo) then
  begin
    WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
    CloseHandle(ShExecInfo.hProcess);
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    ExecAndWait('C:\Windows\Notepad.exe', '', Self.Handle);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
  ShowMessage('Fertig');
end;
Zitat:

Zitat von QuickAndDirty (Beitrag 1115734)
Aber mit meiner setup.exe ist nach dem Splashscreen Schluss.
Warum?

Nutzt du Windows Vista / 7? Dann starte sfx.exe mal mit Adminrechten oder benenne setup.exe um in meinprogramm.exe und probier es nochmal.

Gruß, Chris

Luckie 9. Aug 2011 11:02

AW: Too stupid to execute and wait
 
Wo mische ich? Ich habe nur Delphi 7 hier, deshalb habe ich ausdrücklich WideStrings benutzt.

QuickAndDirty 9. Aug 2011 11:05

AW: Too stupid to execute and wait
 
Zitat:

Zitat von ChrisE (Beitrag 1115736)
Zitat:

Zitat von Luckie (Beitrag 1115732)
Funktioniert wunderbar:

Hmm, du mischst aber auch WideString und AnsiString bzw. gibst es nicht explizit an.
Delphi-Quellcode:
  ShExecInfo.lpVerb := 'open';
Ich würde es so versuchen (Deine Sourcen angepasst):
Delphi-Quellcode:
uses
  ShellAPI;

procedure ExecAndWait(Filename, Params: string; AHWnd: HWND; WindowState: word = SW_SHOWNORMAL);
var
  ShExecInfo: SHELLEXECUTEINFO;
const
  SEE_MASK_NOASYNC= $100;
begin
  ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
  ShExecInfo.Wnd := AHWnd;
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
  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;
  if ShellExecuteExW(@ShExecInfo) then
  begin
    WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
    CloseHandle(ShExecInfo.hProcess);
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    ExecAndWait('C:\Windows\Notepad.exe', '', Self.Handle);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
  ShowMessage('Fertig');
end;
Zitat:

Zitat von QuickAndDirty (Beitrag 1115734)
Aber mit meiner setup.exe ist nach dem Splashscreen Schluss.
Warum?

Nutzt du Windows Vista / 7? Dann starte sfx.exe mal mit Adminrechten oder benenne setup.exe um in meinprogramm.exe und probier es nochmal.

Gruß, Chris

Ich nutze 2000, xp, und 7
über all das selbe Verhalten nur das es bei Windows 7 erst mit Adminrechten überhaupt in den Splashscreen kommt.

Ich testete dioe letzen paar minuten hier auf einer Windows 2000 virtuellen maschiene...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr.
Seite 2 von 5     12 34     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