... Hab zeromemory vergessen,...
Wieso verwendest du eigentlich keinen "Delphi Layer" um die
API-Funktion herum?
Also ich meine , man sollte solche relativ komplexen
API-Funktionen wie ShellExecuteEx() nicht direkt aufrufen, sondern in eine Funktion verpacken, damit es beim Aufruf in der Anwendung keine Probleme gibt.
Hier Beispielcode aus der JCL:
Delphi-Quellcode:
function ShellExec(const FileName: string; const Parameters: string;
const Verb: string; CmdShow: Integer): Boolean;
var
Sei: TShellExecuteInfo;
begin
FillChar(Sei, SizeOf(Sei), #0);
Sei.cbSize := SizeOf(Sei);
Sei.fMask := SEE_MASK_DOENVSUBST or SEE_MASK_FLAG_NO_UI;
Sei.lpFile := PChar(FileName);
Sei.lpParameters := PCharOrNil(Parameters);
Sei.lpVerb := PCharOrNil(Verb);
Sei.nShow := CmdShow;
Result := ShellExecuteEx(@Sei);
end;
//------------------------------------------------------------------------------
function ShellExecAndWait(const FileName: string; const Parameters: string;
const Verb: string; CmdShow: Integer): Boolean;
var
Sei: TShellExecuteInfo;
begin
FillChar(Sei, SizeOf(Sei), #0);
Sei.cbSize := SizeOf(Sei);
Sei.fMask := SEE_MASK_DOENVSUBST or SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
Sei.lpFile := PChar(FileName);
Sei.lpParameters := PCharOrNil(Parameters);
Sei.lpVerb := PCharOrNil(Verb);
Sei.nShow := CmdShow;
Result := ShellExecuteEx(@Sei);
if Result then
begin
WaitForInputIdle(Sei.hProcess, INFINITE);
WaitForSingleObject(Sei.hProcess, INFINITE);
CloseHandle(Sei.hProcess);
end;
end;
function PCharOrNil(const AString: string): PChar;
begin
if AString = '' then
Result := nil
else
Result := PChar(AString);
end;
Indem man eine dünne Schicht um Windows
API Funktionen legt erhält man folgende Vorteile:
* vereinfachter Aufruf
* Möglichkeit gezielt einen Breakpoint zu setzen oder Aufrufe zu loggen
* Vermeidung von Fehlern wie z.B. fehlendes ZeroMemory
Das heisst jetzt nicht, man soll JEDE Windows
API-Funktion kapseln, aber bei ShellExecuteEx lohnt es sich definitiv.