Jak to teraz jest modne - poprosiłem naszego przyjaciela GPT o pomoc, także poniżej daję, co on wygenerował. Jeśli będzie działać - proszę o łapkę. Jeśli wyczyści Ci dysk - nie moja wina, nie ja to pisałem ;)
Należy pamiętać, że kod Delphi nie zawiera dyrektyw preprocesora, takich jak #define czy #include. Kod Delphi jest kompilowany jako jednostka, a odpowiednie jednostki są używane przez użyte biblioteki. Przekształcony kod Delphi korzysta z odpowiednich jednostek, takich jak ActiveX, ComObj, ShlObj, ShlDisp, ExDisp i Windows, które zapewniają odpowiednie interfejsy i funkcje wymagane przez kod C++.
uses
ActiveX, ComObj, ShlObj, ShlDisp, ExDisp, Windows;
procedure FindDesktopFolderView(const riid: TGUID; var ppv: Pointer);
var
spShellWindows: IShellWindows;
vtLoc, vtEmpty: Variant;
lhwnd: Integer;
spdisp: IDispatch;
spBrowser: IShellBrowser;
spView: IShellView;
begin
spShellWindows := CreateComObject(CLSID_ShellWindows) as IShellWindows;
vtLoc := CSIDL_DESKTOP;
vtEmpty := System.Variants.EmptyParam;
lhwnd := 0;
spShellWindows.FindWindowSW(vtLoc, vtEmpty, SWC_DESKTOP, lhwnd, SWFO_NEEDDISPATCH, spdisp);
spdisp.QueryInterface(IServiceProvider, spBrowser);
spBrowser.QueryActiveShellView(spView);
spView.QueryInterface(riid, ppv);
end;
procedure GetDesktopAutomationObject(const riid: TGUID; var ppv: Pointer);
var
spsv: IShellView;
spdispView: IDispatch;
begin
FindDesktopFolderView(IID_IShellView, spsv);
spsv.GetItemObject(SVGIO_BACKGROUND, riid, spdispView);
spdispView.QueryInterface(riid, ppv);
end;
procedure ShellExecuteFromExplorer(const pszFile, pszParameters, pszDirectory, pszOperation: PWideChar; nShowCmd: Integer = SW_SHOWNORMAL);
var
spFolderView: IShellFolderViewDual;
spdispShell: IDispatch;
spShellDispatch: IShellDispatch2;
begin
GetDesktopAutomationObject(IID_IShellFolderViewDual, spFolderView);
spFolderView.get_Application(spdispShell);
spdispShell.QueryInterface(IShellDispatch2, spShellDispatch);
spShellDispatch.ShellExecute(pszFile, pszParameters, pszDirectory, pszOperation, nShowCmd);
end;
begin
if ParamCount < 1 then
Exit;
CoInitialize(nil);
try
ShellExecuteFromExplorer(PWideChar(ParamStr(1)),
PWideChar(IfThen(ParamCount >= 2, ParamStr(2), '')),
PWideChar(IfThen(ParamCount >= 3, ParamStr(3), '')),
PWideChar(IfThen(ParamCount >= 4, ParamStr(4), '')),
IfThen(ParamCount >= 5, StrToInt(ParamStr(5)), SW_SHOWNORMAL));
finally
CoUninitialize;
end;
end.