![]() |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
NtQueryInformationProcess, aber ich bin nicht sicher, ob die ProcessID in Win2000 damit ermittelt werden kann.
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Zitat:
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Zitat:
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Danke für die schnelle Antwort.
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
eigenes Thema erstellt...
|
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Hallo,
muss das Handle auch irgendwann geschlossen werden, wenn ich den ![]()
Delphi-Quellcode:
Oder kümmert sich das System selber darum, wenn das Programm dann wirklich mal vom Benutzer geschlossen wird?
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 (Win32Platform = VER_PLATFORM_WIN32_NT) 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); 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); end; end; Gruss |
Re: Problem ShellExecute / CreateProcess + Wait mit Vista UA
Das Handle muss geschlossen werden. Aber wenn du es nicht brauchst, kannst du auch einfach auf das Flag SEE_MASK_NOCLOSEPROCESS verzichten, dann wird das bereits von ShellExecuteEx selbst gemacht.
|
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Hi ihr Lieben,
wie kann ich nun mit obiger Funktion eine Datei starten? Eingebunden hab ich sie noch bekommen, wenngleich ich aufgrund des Unicode's da Sorgen hatte (nutze Delphi XE) und mir nicht klar ist, welche uses ich ggf. noch nutzen muss, damit der die Funktionen "WideFileExists" z.B. findet. Ihr bemerkt schon, ich starte gerade erst mit dem ganzen Kram. Jedenfalls führte z.B. folgende Zeile natürlich zu keinem Erfolg, ich begreife einfach den Funktionsaufruf nicht, den ich durchführen muss. Welche Parameter sind zu übergeben, damit das klappt? Ist der Deklaration werde ich leider nicht hinreichend schlau und bitte um Hilfe dazu. Umgebaut hatte ich das nun zu:
Delphi-Quellcode:
und versuche nun via
function ExecAndWait(Filename, Params: Widestring;
WindowState: word = SW_SHOWNORMAL): boolean; var ShExecInfoA: SHELLEXECUTEINFOA; r : Cardinal; //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecuteex.asp //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shellexecuteinfo.asp begin Result := false; if Filename = '' then exit; if not FileExists(FileName) then begin // Log (true,P_ERROR,WideFormat(_('Kann die angegebene Datei nicht finden: %s'),[FileName])); exit; end; 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 begin r := WaitForSingleObject(ShExecInfoA.hProcess, INFINITE); end; finally CloseHandle(ShExecInfoA.hProcess); end; end;
Delphi-Quellcode:
ExecandWait('Ping.EXE','>> 192.168.212.253 >> testping.txt');
Es auch zu nutzen. Ich weiß, der Aufruf ist falsch, aber ich brauche hier Starthilfe, bitte. Noch toller wäre es ja, 'n Ping direk tzu nutzen, aber nach 4-6 Stunden probieren aller möglichen Sachen, die durch die bank alle nicht klappten, wollte ich es eben über das doofe ping.exe lösen. LG Shyran |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Du vermischst Ansi (SHELLEXECUTEINFOA) mit Unicode. Hast Du es einmal mit der Version aus
![]() P.S.: Willkommen in der DP :dp: [edit] Nachtrag: FileExists müsste in SysUtils stehen [/edit] |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Hi,
danke für das Willkommen! *freu* Und: Ja, habe ich probiert. Daher kam mein Einwand, dass er die "Wide"-Ausdrücke usw. beim Kompilieren nicht finden konnte und daher auch mein Umbau dazu. Nochmal deutlich: Die Funktion "WideFileExists" kannte er nicht. In den uses stehen die SysUtils drin, gerade eben nachgeschaut. Noch eine Idee? Grüßlis |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 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