mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2025-01-24 23:23:44 +01:00
ShellExecuteFromExplorer returns an HRESULT
This commit is contained in:
parent
abdbeee485
commit
d67c715062
@ -501,10 +501,11 @@ BOOL SystemShutdown(BOOL reboot)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindDesktopFolderView(REFIID riid, void** ppv)
|
HRESULT FindDesktopFolderView(REFIID riid, void** ppv)
|
||||||
{
|
{
|
||||||
|
HRESULT hr = E_FAIL;
|
||||||
IShellWindows* spShellWindows = NULL;
|
IShellWindows* spShellWindows = NULL;
|
||||||
CoCreateInstance(
|
hr = CoCreateInstance(
|
||||||
&CLSID_ShellWindows,
|
&CLSID_ShellWindows,
|
||||||
NULL,
|
NULL,
|
||||||
CLSCTX_ALL,
|
CLSCTX_ALL,
|
||||||
@ -521,7 +522,7 @@ void FindDesktopFolderView(REFIID riid, void** ppv)
|
|||||||
vtLoc.intVal = CSIDL_DESKTOP;
|
vtLoc.intVal = CSIDL_DESKTOP;
|
||||||
long lhwnd = 0;
|
long lhwnd = 0;
|
||||||
IDispatch* spdisp = NULL;
|
IDispatch* spdisp = NULL;
|
||||||
spShellWindows->lpVtbl->FindWindowSW(
|
hr = spShellWindows->lpVtbl->FindWindowSW(
|
||||||
spShellWindows,
|
spShellWindows,
|
||||||
&vtLoc,
|
&vtLoc,
|
||||||
&vtEmpty,
|
&vtEmpty,
|
||||||
@ -533,18 +534,18 @@ void FindDesktopFolderView(REFIID riid, void** ppv)
|
|||||||
if (spdisp)
|
if (spdisp)
|
||||||
{
|
{
|
||||||
IServiceProvider* spdisp2 = NULL;
|
IServiceProvider* spdisp2 = NULL;
|
||||||
spdisp->lpVtbl->QueryInterface(spdisp, &IID_IServiceProvider, &spdisp2);
|
hr = spdisp->lpVtbl->QueryInterface(spdisp, &IID_IServiceProvider, &spdisp2);
|
||||||
if (spdisp2)
|
if (spdisp2)
|
||||||
{
|
{
|
||||||
IShellBrowser* spBrowser = NULL;
|
IShellBrowser* spBrowser = NULL;
|
||||||
spdisp2->lpVtbl->QueryService(spdisp2, &SID_STopLevelBrowser, &IID_IShellBrowser, &spBrowser);
|
hr = spdisp2->lpVtbl->QueryService(spdisp2, &SID_STopLevelBrowser, &IID_IShellBrowser, &spBrowser);
|
||||||
if (spBrowser)
|
if (spBrowser)
|
||||||
{
|
{
|
||||||
IShellView* spView = NULL;
|
IShellView* spView = NULL;
|
||||||
spBrowser->lpVtbl->QueryActiveShellView(spBrowser, &spView);
|
hr = spBrowser->lpVtbl->QueryActiveShellView(spBrowser, &spView);
|
||||||
if (spView)
|
if (spView)
|
||||||
{
|
{
|
||||||
spView->lpVtbl->QueryInterface(spView, riid, ppv);
|
hr = spView->lpVtbl->QueryInterface(spView, riid, ppv);
|
||||||
spView->lpVtbl->Release(spView);
|
spView->lpVtbl->Release(spView);
|
||||||
}
|
}
|
||||||
spBrowser->lpVtbl->Release(spBrowser);
|
spBrowser->lpVtbl->Release(spBrowser);
|
||||||
@ -555,26 +556,29 @@ void FindDesktopFolderView(REFIID riid, void** ppv)
|
|||||||
}
|
}
|
||||||
spShellWindows->lpVtbl->Release(spShellWindows);
|
spShellWindows->lpVtbl->Release(spShellWindows);
|
||||||
}
|
}
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetDesktopAutomationObject(REFIID riid, void** ppv)
|
HRESULT GetDesktopAutomationObject(REFIID riid, void** ppv)
|
||||||
{
|
{
|
||||||
|
HRESULT hr = E_FAIL;
|
||||||
IShellView* spsv = NULL;
|
IShellView* spsv = NULL;
|
||||||
FindDesktopFolderView(&IID_IShellView, &spsv);
|
hr = FindDesktopFolderView(&IID_IShellView, &spsv);
|
||||||
if (spsv)
|
if (spsv)
|
||||||
{
|
{
|
||||||
IDispatch* spdispView = NULL;
|
IDispatch* spdispView = NULL;
|
||||||
spsv->lpVtbl->GetItemObject(spsv, SVGIO_BACKGROUND, &IID_IDispatch, &spdispView);
|
hr = spsv->lpVtbl->GetItemObject(spsv, SVGIO_BACKGROUND, &IID_IDispatch, &spdispView);
|
||||||
if (spdispView)
|
if (spdispView)
|
||||||
{
|
{
|
||||||
spdispView->lpVtbl->QueryInterface(spdispView, riid, ppv);
|
hr = spdispView->lpVtbl->QueryInterface(spdispView, riid, ppv);
|
||||||
spdispView->lpVtbl->Release(spdispView);
|
spdispView->lpVtbl->Release(spdispView);
|
||||||
}
|
}
|
||||||
spsv->lpVtbl->Release(spsv);
|
spsv->lpVtbl->Release(spsv);
|
||||||
}
|
}
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShellExecuteFromExplorer(
|
HRESULT ShellExecuteFromExplorer(
|
||||||
PCWSTR pszFile,
|
PCWSTR pszFile,
|
||||||
PCWSTR pszParameters,
|
PCWSTR pszParameters,
|
||||||
PCWSTR pszDirectory,
|
PCWSTR pszDirectory,
|
||||||
@ -582,16 +586,17 @@ void ShellExecuteFromExplorer(
|
|||||||
int nShowCmd
|
int nShowCmd
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
HRESULT hr = E_FAIL;
|
||||||
IShellFolderViewDual* spFolderView = NULL;
|
IShellFolderViewDual* spFolderView = NULL;
|
||||||
GetDesktopAutomationObject(&IID_IShellFolderViewDual, &spFolderView);
|
hr = GetDesktopAutomationObject(&IID_IShellFolderViewDual, &spFolderView);
|
||||||
if (spFolderView)
|
if (spFolderView)
|
||||||
{
|
{
|
||||||
IDispatch* spdispShell = NULL;
|
IDispatch* spdispShell = NULL;
|
||||||
spFolderView->lpVtbl->get_Application(spFolderView, &spdispShell);
|
hr = spFolderView->lpVtbl->get_Application(spFolderView, &spdispShell);
|
||||||
if (spdispShell)
|
if (spdispShell)
|
||||||
{
|
{
|
||||||
IShellDispatch2* spdispShell2 = NULL;
|
IShellDispatch2* spdispShell2 = NULL;
|
||||||
spdispShell->lpVtbl->QueryInterface(spdispShell, &IID_IShellDispatch2, &spdispShell2);
|
hr = spdispShell->lpVtbl->QueryInterface(spdispShell, &IID_IShellDispatch2, &spdispShell2);
|
||||||
if (spdispShell2)
|
if (spdispShell2)
|
||||||
{
|
{
|
||||||
BSTR a_pszFile = pszFile ? SysAllocString(pszFile): SysAllocString(L"");
|
BSTR a_pszFile = pszFile ? SysAllocString(pszFile): SysAllocString(L"");
|
||||||
@ -608,7 +613,7 @@ void ShellExecuteFromExplorer(
|
|||||||
a_pszOperation.bstrVal = pszOperation ? SysAllocString(pszOperation) : SysAllocString(L"");
|
a_pszOperation.bstrVal = pszOperation ? SysAllocString(pszOperation) : SysAllocString(L"");
|
||||||
a_nShowCmd.vt = VT_INT;
|
a_nShowCmd.vt = VT_INT;
|
||||||
a_nShowCmd.intVal = nShowCmd;
|
a_nShowCmd.intVal = nShowCmd;
|
||||||
spdispShell2->lpVtbl->ShellExecuteW(spdispShell2, a_pszFile, a_pszParameters, a_pszDirectory, a_pszOperation, a_nShowCmd);
|
hr = spdispShell2->lpVtbl->ShellExecuteW(spdispShell2, a_pszFile, a_pszParameters, a_pszDirectory, a_pszOperation, a_nShowCmd);
|
||||||
if (a_pszOperation.bstrVal)
|
if (a_pszOperation.bstrVal)
|
||||||
{
|
{
|
||||||
SysFreeString(a_pszOperation.bstrVal);
|
SysFreeString(a_pszOperation.bstrVal);
|
||||||
@ -631,4 +636,5 @@ void ShellExecuteFromExplorer(
|
|||||||
}
|
}
|
||||||
spFolderView->lpVtbl->Release(spFolderView);
|
spFolderView->lpVtbl->Release(spFolderView);
|
||||||
}
|
}
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#define SETUP_UTILITY_NAME "ep_setup.exe"
|
#define SETUP_UTILITY_NAME "ep_setup.exe"
|
||||||
#define TOAST_BUFSIZ 1024
|
#define TOAST_BUFSIZ 1024
|
||||||
#define SEH_REGPATH "Control Panel\\Quick Actions\\Control Center\\QuickActionsStateCapture\\ExplorerPatcher"
|
#define SEH_REGPATH "Control Panel\\Quick Actions\\Control Center\\QuickActionsStateCapture\\ExplorerPatcher"
|
||||||
|
#define EP_SETUP_HELPER_SWITCH "/CreateExplorerShellUnelevatedAfterServicing"
|
||||||
|
|
||||||
#define WM_MSG_GUI_SECTION WM_USER + 1
|
#define WM_MSG_GUI_SECTION WM_USER + 1
|
||||||
#define WM_MSG_GUI_SECTION_GET 1
|
#define WM_MSG_GUI_SECTION_GET 1
|
||||||
@ -85,11 +86,11 @@ typedef struct _StuckRectsData
|
|||||||
POINT pt;
|
POINT pt;
|
||||||
} StuckRectsData;
|
} StuckRectsData;
|
||||||
|
|
||||||
void FindDesktopFolderView(REFIID riid, void** ppv);
|
HRESULT FindDesktopFolderView(REFIID riid, void** ppv);
|
||||||
|
|
||||||
void GetDesktopAutomationObject(REFIID riid, void** ppv);
|
HRESULT GetDesktopAutomationObject(REFIID riid, void** ppv);
|
||||||
|
|
||||||
void ShellExecuteFromExplorer(
|
HRESULT ShellExecuteFromExplorer(
|
||||||
PCWSTR pszFile,
|
PCWSTR pszFile,
|
||||||
PCWSTR pszParameters,
|
PCWSTR pszParameters,
|
||||||
PCWSTR pszDirectory,
|
PCWSTR pszDirectory,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user