![]() |
ShellExecuteEx -> Access denied
Hallo,
ich stehe etwas auf dem Schlauch.. Wenn ich mit shellExecute eine bat Datei starten will dann funktioniert das so:
Delphi-Quellcode:
Die Datei start_tool.bat liegt in gleichen Verzeichnis wie die exe.
parameter := format('%s',['einige Parameter']);
if shellExecute(handle,nil,pchar('start_tool.bat'),pChar(parameter),nil,SW_SHOW) <= 32 then begin fLogger.addItem(format('start_tool.bat %s',[parameter]),0); fLogger.addItem(sysErrorMessage(getLastError),0); end; Nun möchte ich aber shellExecuteEx verwenden. Ich möchte die gestartete Datei überwachen.
Delphi-Quellcode:
Nur erhalte ich damit immer die Fehlermeldung "Access denied" ErrorCode 5.
parameter := format('%s',['einige Parameter']);
shellExeInfo.cbSize := sizeOf(TShellExecuteInfo); shellExeInfo.Wnd := handle; shellExeInfo.lpVerb := 'open'; shellExeInfo.lpFile := pchar('start_tool.bat'); shellExeInfo.fMask := SEE_MASK_NOCLOSEPROCESS; shellExeInfo.lpParameters := pChar(parameter); shellExeInfo.lpDirectory := pChar(extractFileDir(paramStr(0))); shellExeInfo.nShow := SW_SHOW; if not shellExecuteEx(@shellExeInfo) then begin fLastError := getLastError; fLogger.addItem(sysErrorMessage(fLastError)+' ['+intToStr(fLastError)+']',0); fReturnValue := 3; end else begin try repeat waitState := MsgWaitForMultipleObjects(1,shellExeInfo.hProcess,false,INFINITE,QS_ALLINPUT); if waitState <> WAIT_OBJECT_0 then sleep(250); until waitState = WAIT_OBJECT_0; finally closeHandle(shellExeInfo.hProcess); end; end; Und ich weiß nicht warum? Jemand eine Idee? Grüße Klaus |
AW: ShellExecuteEx -> Access denied
Was mir nur spontan, ohne in die API-Dokumentation zu schauen auffällt ist, dass du bei shellExeInfo zwar die cbSize setzt, aber in den anderen Feldern (die du nicht explizit beschreibst) noch alles mögliche drinsteht.
Ich würde als erstes noch ein
Delphi-Quellcode:
einfügen.
shellExeInfo := Default(TStartupInfo);
|
AW: ShellExecuteEx -> Access denied
Hallo,
danke für den Hinweis, werde das Record noch nullen. Fehler ist/war aber ein anderer.
Delphi-Quellcode:
TShellExecuteInfo war mein Versuch die shellexecuteInfo nachzubilden.
shellExeInfo.cbSize := sizeOf(TShellExecuteInfo);
In meinem Record ist dann wohl noch ein Fehler enthalten.
Delphi-Quellcode:
TDummyUnionName = record
hIcon: THandle; hMonitor: THandle; end; TShellExecuteInfo = record cbSize: cardinal; //dword fMask: cardinal; //ulong hwnd: THandle; lpVerb: pChar; lpFile: pChar; lpParameters: pChar; lpDirectory: pChar; nShow: Integer; hInstApp: THandle; lpIDList: pointer; lpClass: pChar; hkeyClass: byte; dwHotKey: cardinal; //dword dummyUnionName: TDummyUnionName; hProcess: THandle; end;
Delphi-Quellcode:
So funktioniert es...
shellExeInfo.cbSize := sizeOf(ExecuteInfo);
Edit: Wenn man aus dem Record TDummyUnionName ein Union macht,
Delphi-Quellcode:
dann klappt es auch mit der selbst gebastelten TShellExecuteInfo.
TDummyUnionName = record
case boolean of true: (hIcon: THandle); false: (hMonitor: THandle); end; Danke. Grüße Klaus |
AW: ShellExecuteEx -> Access denied
Zitat:
Delphi-Quellcode:
Rate mal was passiert, wenn Format oder fLogger.AddItem den Fehlercode setzen/ändern. :angel:
Parameter := Format('%s', ['einige Parameter']);
if ShellExecute(handle, nil, PChar('start_tool.bat'), PChar(Parameter), nil, SW_SHOW) <= 32 then begin Err := GetLastError; fLogger.AddItem(Format('start_tool.bat %s', [Parameter]), 0); fLogger.AddItem(SysErrorMessage(Err), 0); end; // oder Parameter := Format('%s', ['einige Parameter']); if ShellExecute(handle, nil, PChar('start_tool.bat'), PChar(Parameter), nil, SW_SHOW) <= 32 then begin Err := SysErrorMessage(GetLastError); fLogger.AddItem(Format('start_tool.bat %s', [Parameter]), 0); fLogger.AddItem(Err, 0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 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