Einzelnen Beitrag anzeigen

ringli

Registriert seit: 7. Okt 2004
461 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Programm als Benutzer starten, wenn eigene Anwendung als Admin läuft

  Alt 29. Jun 2020, 20:51
Um ein Programm als normaler Benutzer zu starten wenn meine eigene Anwendung als Administrator läuft, würde ich gerne den Quelltext verwenden den ich hier gefunden habe: https://pastebin.com/S9WLMDhB

Der Code funktioniert, allerdings würde ich gerne auf möglicherweise auftretende Fehler reagieren können. Dazu habe ich die original Prozedur ShellExecuteFromExplorer zum Test folgendermassen umgeschrieben:
Delphi-Quellcode:
function ShellExecuteFromExplorer(lpVerb, lpFile, lpParameters, lpDirectory : PChar;
                                   nShow : Integer) : HRESULT;
var
  FolderView: IShellFolderViewDual;
  DispShell: IDispatch;
  ShellDispatch: IShellDispatch2;
begin
  Result := E_NOTIMPL;
  GetDesktopAutomationObject(IShellFolderViewDual, FolderView);
  OleCheck(FolderView.get_Application(DispShell));
  OleCheck(DispShell.QueryInterface(IShellDispatch2, ShellDispatch));
  Result := ShellDispatch.ShellExecute(lpFile, String(lpParameters), String(lpDirectory), String(lpVerb), nShow);
end;
Übergebe ich jetzt bspw. absichtlich einen ungültigen Pfad an die Funktion, erhalte ich eine Fehlermeldung obwohl ich kein ShowMessage o.ä. in meinem Quelltext habe:
Code:
"%systemroot%\System32\cmd.exe" konnte nicht gefunden werden. Stellen Sie sicher, dass Sie den Namen richtig eingegeben haben und wiederholen Sie den Vorgang.
Desweiteren habe ich es auch mal mit einem try..except-Block versucht:
Delphi-Quellcode:
function ShellExecuteFromExplorer(lpVerb, lpFile, lpParameters, lpDirectory : PChar;
                                   nShow : Integer) : HRESULT;
var
  FolderView: IShellFolderViewDual;
  DispShell: IDispatch;
  ShellDispatch: IShellDispatch2;
begin
  Result := E_NOTIMPL;
  GetDesktopAutomationObject(IShellFolderViewDual, FolderView);
  OleCheck(FolderView.get_Application(DispShell));
  OleCheck(DispShell.QueryInterface(IShellDispatch2, ShellDispatch));
  try
    Result := ShellDispatch.ShellExecute(lpFile, String(lpParameters), String(lpDirectory), String(lpVerb), nShow);
  except
    showmessage('Meine eigene Fehlermeldung');
  end;
end;
Die Fehlermeldung bleibt leider die gleiche. Was muss ich ändern damit ich eigene Fehlermeldungen verwenden kann?
  Mit Zitat antworten Zitat