![]() |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Soooo.
Bei himitsu's Quellcode aus beitrag #12 findet er den Bezeichner "Win32IsUnicode" nicht, in Zeile 12:
Delphi-Quellcode:
Daran scheitert's zumindest schonmal.
...
{$IFDEF UNICODE} if Win32IsUnicode then begin blabla |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
|
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Ah okay, also eine globale Variable, die i-wie abfragt, ob mein System auf NT basiert, ja?
Okay, ich könnte das für meinen Fall nun "drumherum" coden, indem ich vorher ein
Delphi-Quellcode:
drauf loslasse. Aber das ist ja nicht direkt der Sinn ...
var Win32IsUnicode : Boolean;
... Win32IsUnicode:=True; Ich habe auch versucht, die beiden Links mal zu nutzen, die in Deinem verlinkten Beitrag direkt unter dem Hinweis erwähnt sind, leider führten die ins Leere. Ich schaut mir die URL an und wusste dann, wonach ich suchen musste (ShellExec usw.), aber da wurde ich nicht schlau draus, wie ich die Win32IsUnicode Variable dynamisch, abhängig vom eingesetzten OS mit Leben fülle. Wald ... Bäume ... *hilflos guck* :-) |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Die Abfrage kann man sich sparen, da du mit XE ohnehin nicht mehr für Win9x kompilieren kann. Insofern kannst du davon ausgehen, dass du Windows 2000 oder höher hast und einfach die Unicoderoutinen verwenden. ;-)
|
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Versuch es doch z.B. mit
Delphi-Quellcode:
function Win32IsUnicode: Boolean;
begin Result := SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT; end; |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Auf Jaenicke vertrauend habe ich den Code mal zusammengestaucht:
Delphi-Quellcode:
Im gleichen Verzeichnis wie das .exe File meines programms beifndet sich auch die Ping.exe (das mach ich später selbstverständlich noch anders, aus dem WIndows-System-verz starten usw. aber zum Testen tut's das hier).
//SHELL TEST DP
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} 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 {$ENDIF} end; //SHELL Aufruf ENDE DP Mein Aufruf:
Delphi-Quellcode:
ExecAndWait('Ping.EXE','192.168.212.253 >> testping.txt');
Resultat ist ein kurzes Aufploppen einer Shell und direktes Schliessen, eine Datei "testping.txt" taucht aber nicht auf oder so. |
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Und so?
Delphi-Quellcode:
[edit] Statt /c kannst Du es auch zunächst mit /k probieren. Für die Datei solltest Du aber unbedingt einen absoluten Pfad angeben. [/edit]
ExecAndWait('cmd','/c ping 192.168.212.253 >> testping.txt');
|
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Leider ebenfalls kein Ergebnis. Ich habe zur Sicherheit auch noch jedem Probieren (/c, /k, auch mal absoluten Pfad wie
Delphi-Quellcode:
die Festplatte nach der Datei durchsuchen lassen, um auf Nummer sicher zu gehen.
ExecAndWait('Ping.EXE',' 192.168.212.253 >> d:\testping.txt');
|
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Also
Delphi-Quellcode:
funktioniert hier bei mir einwandfrei (XE auf Vista 32).
ExecAndWait('cmd','/k ping 192.168.212.253');
|
AW: Problem ShellExecute / CreateProcess + Wait mit Vista UAC
Zitat:
Einfacher ist es allerdings, wenn du statt dieser Umleitung einfach die Ausgabe der ping.exe selbst ausliest. Dann brauchst du auch keine temporäre Datei, bei der du wiederum erst schauen musst wo du Schreibrechte dafür hast... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 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 by Thomas Breitkreuz