![]() |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Zitat:
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
jupp, hatte ich auch schon germerkt :angel2:
dann aber zumindestens noch 'ne Version, die mit dem arbeitet, was Delphi kann: (bis D2007 in ANSI und ab WinNT und D2009 in Unicode)
Delphi-Quellcode:
[edit] noch schnell ein {$IFDEF UNICODE} eingefügt ... wenn Delphi eh standardmäßig kein Unicode kann, braucht man den Code ja hierbei nicht. :angel2:
function ExecAndWait(Filename, Params: String;
WindowState: Word = SW_SHOWNORMAL): boolean; var {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF} ShExecInfoA: SHELLEXECUTEINFOA; // MSDN: ShellExecuteEx, ShellExecuteInfo begin Result := false; if (Filename = '') or not FileExists(FileName) then exit; {$IFDEF UNICODE} if Win32IsUnicode then begin ShExecInfoW.Wnd := GetForegroundWindow; ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW); ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoW.lpVerb := 'open'; ShExecInfoW.lpFile := PWideChar(WideString(Filename)); ShExecInfoW.lpParameters := PWideChar(WideString(Params)); ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename))); ShExecInfoW.nShow := WindowState; Result := ShellExecuteExW(@ShExecInfoW); try if Result then WaitForSingleObject(ShExecInfoW.hProcess, INFINITE); finally CloseHandle(ShExecInfoW.hProcess); end; end else {$ENDIF} begin ShExecInfoA.Wnd := GetForegroundWindow; ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA); ShExecInfoA.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoA.lpVerb := 'open'; ShExecInfoA.lpFile := PAnsiChar(AnsiString(Filename)); ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params)); ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(Filename))); ShExecInfoA.nShow := WindowState; Result := ShellExecuteExA(@ShExecInfoA); try if Result then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE); finally CloseHandle(ShExecInfoA.hProcess); end; end; end; |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Nu isses perfekt! :thumb:
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Hallo,
wie kann ich die Parameter auslesen, die das auszuführende Programm nach Ausführung zurückgibt? Vielen Dank! :bounce2: |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Was für Parameter meinst du? ExitCode? Handle?
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
ExitCode denke ich. Das externe Programm führt eine Berechnung durch und gibt eine 1 zurück wenn alles ok ist und eine andere Zahl, wenn ein Fehler auftritt (die Zahl entspricht dann dem auszugebenden Error Code). Nur falls eine 1 ausgegeben wird, soll das ursprüngliche Programm (von dem das externe Programm gestartet wurde) weiterlaufen. Wenn ich es richtig verstanden habe, dann bräuchte ich ein Handle doch nur, um aus dem startenden Programm bei dem externen Programm zur Laufzeit Veränderung etc. durchzuführen.
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Hast du das externe Programm selbst geschrieben? Wenn du wirklich den ExitCode meinst, ist das eine komische Verwendung. Normalerweise wird dein Programm mit ExitProcess(0) << ExitCode 0 beendet, um zu signalisieren, dass alles korrekt beendet wurde. ExitCode 1 bedeutet, dass ein Fehler aufgetreten ist.
Naja guck dir mal die ![]() |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Hallo zusammen,
im Bezug auf die Antwort #12 hier im Thread and ein paar davor habe ich einige Fragen: Was findet man in "ShExecInfoA.hProcess" wieder? Ist es die Prozess-ID? Wenn ja: ist es die, die auch im Taskmanager angezeigt wird? Ich bekomme nämlich zwei unterschriedliche als Ergebnis. Wenn die gleich sein müssten: was könnte da falsch laufen? Wenn "ShExecInfoA.hProcess" nicht die Prozess-ID darstellt: wie komme ich an diese dran? |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Wie das Präfix h andeutet, handelt es sich um ein Prozess-Handle. Ab Windows XP SP 1 kommst du mit
![]() |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Danke für die Antwort!
Die Verwendung von GetProcessId scheint allerdings problematisch zu sein, da es diese Funktion eerst ab XP SP1 gibt. Habe noch das hier gefunden: GetWindowThreadProcessId, aber auch danach habe ich zwei unterschiedliche Werte. Gibt es denn keine andere Möglichkeit vom Handle zu ProzessID zu gelangen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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