Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem ShellExecute / CreateProcess + Wait mit Vista UAC (https://www.delphipraxis.net/92114-problem-shellexecute-createprocess-wait-mit-vista-uac.html)

GPRSNerd 17. Feb 2009 09:24

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
 
Zitat:

ShExecInfo: SHELLEXECUTEINFO;
Das liefe dann aber nicht mehr unter Windows 98/ME etc, die noch nicht unicode-kompatibel sind.

himitsu 17. Feb 2009 09:37

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:
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;
[edit] noch schnell ein {$IFDEF UNICODE} eingefügt ... wenn Delphi eh standardmäßig kein Unicode kann, braucht man den Code ja hierbei nicht. :angel2:

GPRSNerd 17. Feb 2009 09:55

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
 
Nu isses perfekt! :thumb:

Jester101 2. Mai 2009 12:21

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:

Zacherl 2. Mai 2009 12:34

Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
 
Was für Parameter meinst du? ExitCode? Handle?

Jester101 2. Mai 2009 13:23

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.

Zacherl 2. Mai 2009 13:44

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 MSDN-Library durchsuchenGetExitCodeProcess API an. Vielleicht ist es ja das was du suchst.

shadowman 31. Mai 2009 08:16

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?

Apollonius 31. Mai 2009 09:59

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 MSDN-Library durchsuchenGetProcessId vom Handle auf die ID.

shadowman 1. Jun 2009 12:12

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 20:05 Uhr.
Seite 2 von 5     12 34     Letzte »    

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