Takes a bit more Code in PureBasic
Code: Select all
EnableExplicit
Import "Uuid.Lib"
IID_IShellFolderViewDual
CLSID_ShellWindows
IID_IShellWindows
IID_IShellView
SID_STopLevelBrowser
IID_IShellBrowser
IID_IDispatch
IID_IShellDispatch2
IID_IServiceProvider
EndImport
Macro SUCCEEDED_(HRESULT)
(HRESULT & $80000000 = 0)
EndMacro
Procedure IUnknown_QueryService(*punk.IUnknown, guidService, riid, *ppvOut.Integer)
*ppvOut\i = 0
Protected.IServiceProvider *ISP
Protected hr.l = *punk\QueryInterface(@IID_IServiceProvider, @*ISP)
If Not SUCCEEDED_(hr)
ProcedureReturn #E_NOTIMPL
Else
hr = *ISP\QueryService(guidService, riid, @*ppvOut\i)
*ISP\Release()
EndIf
ProcedureReturn hr
EndProcedure
Procedure GetShellViewForDesktop(riid, *ppv.Integer)
*ppv\i = 0
Protected.IShellWindows *psw
Protected hr.l = CoCreateInstance_(@CLSID_ShellWindows, #Null, #CLSCTX_LOCAL_SERVER, @IID_IShellWindows, @*psw)
If SUCCEEDED_(hr)
Protected hwnd
Protected.IDispatch *pdisp
Protected.VARIANT vEmpty
#SWC_DESKTOP = 8
#SWFO_NEEDDISPATCH = 1
hr = *psw\FindWindowSW(@vEmpty, @vEmpty, #SWC_DESKTOP, @hwnd, #SWFO_NEEDDISPATCH, @*pdisp)
If #S_OK = hr
Protected.IShellBrowser *psb
hr = IUnknown_QueryService(*pdisp, @SID_STopLevelBrowser, @IID_IShellBrowser, @*psb)
If SUCCEEDED_(hr)
Protected.IShellView *psv
hr = *psb\QueryActiveShellView(@*psv)
If SUCCEEDED_(hr)
hr = *psv\QueryInterface(riid, @*ppv\i)
*psv\Release()
EndIf
*psb\Release()
EndIf
*pdisp\Release()
Else
hr = #E_FAIL
EndIf
*psw\Release()
EndIf
ProcedureReturn hr
EndProcedure
Procedure GetShellDispatchFromView(*psv.IShellView, riid, *ppv.Integer)
*ppv\i = 0
Protected.IDispatch *pdispBackground
#SVGIO_BACKGROUND = 0
Protected hr.l = *psv\GetItemObject(#SVGIO_BACKGROUND, @IID_IDispatch, @*pdispBackground)
If SUCCEEDED_(hr)
Protected.IShellFolderViewDual *psfvd
hr = *pdispBackground\QueryInterface(@IID_IShellFolderViewDual, @*psfvd)
If SUCCEEDED_(hr)
Protected.IDispatch *pdisp
hr = *psfvd\get_Application(@*pdisp)
If SUCCEEDED_(hr)
hr = *pdisp\QueryInterface(riid, @*ppv\i)
*pdisp\Release();
EndIf
*psfvd\Release()
EndIf
*pdispBackground\Release();
EndIf
ProcedureReturn hr
EndProcedure
Procedure ShellExecInExplorerProcess(sFile.s, sParameter.s = "")
Protected.IShellView *psv
Protected hr.l = GetShellViewForDesktop(@IID_IShellView, @*psv)
If SUCCEEDED_(hr)
Protected.IShellDispatch2 *psd
hr = GetShellDispatchFromView(*psv, @IID_IShellDispatch2, @*psd)
If SUCCEEDED_(hr)
Protected.VARIANT vArguments, vDirectory, vOperation, vShow
If sParameter <> ""
vArguments\vt = #VT_BSTR
vArguments\bstrVal = SysAllocString_(@sParameter)
EndIf
vShow\vt = #VT_I2
vShow\iVal = #SW_SHOWDEFAULT
hr = *psd\ShellExecute(sFile, @vArguments, @vDirectory, @vOperation, @vShow)
If vArguments\bstrVal
SysFreeString_(vArguments\bstrVal)
EndIf
*psd\Release()
EndIf
*psv\Release()
EndIf
ProcedureReturn hr
EndProcedure
Procedure WinMain()
Protected hr.l = CoInitializeEx_(#Null, #COINIT_APARTMENTTHREADED | #COINIT_DISABLE_OLE1DDE)
If SUCCEEDED_(hr)
ShellExecInExplorerProcess("notepad.exe", "C:\Windows\WindowsUpdate.log")
CoUninitialize_();
EndIf
ProcedureReturn 0;
EndProcedure
WinMain()