Thema: Delphi ShellexecuteEX problem

Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: ShellexecuteEX problem

  Alt 19. Jan 2012, 23:30
... 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.
  Mit Zitat antworten Zitat