diff --git a/ExplorerPatcher/utility.h b/ExplorerPatcher/utility.h index a0fc405..f613087 100644 --- a/ExplorerPatcher/utility.h +++ b/ExplorerPatcher/utility.h @@ -399,6 +399,23 @@ inline BOOL ExitExplorer() return PostMessageW(hWndTray, 0x5B4, 0, 0); } +inline void StartExplorerWithDelay(int delay) +{ + WCHAR wszPath[MAX_PATH]; + ZeroMemory(wszPath, MAX_PATH * sizeof(WCHAR)); + GetWindowsDirectoryW(wszPath, MAX_PATH); + wcscat_s(wszPath, MAX_PATH, L"\\explorer.exe"); + Sleep(delay); + ShellExecuteW( + NULL, + L"open", + wszPath, + NULL, + NULL, + SW_SHOWNORMAL + ); +} + inline void StartExplorer() { diff --git a/ep_setup/ep_setup.c b/ep_setup/ep_setup.c index 895b57a..cbb2599 100644 --- a/ep_setup/ep_setup.c +++ b/ep_setup/ep_setup.c @@ -304,6 +304,33 @@ int WINAPI wWinMain( WCHAR wszPath[MAX_PATH]; ZeroMemory(wszPath, MAX_PATH * sizeof(WCHAR)); + if (argc >= 1 && !_wcsicmp(wargv[0], _T(EP_SETUP_HELPER_SWITCH) L"_" _T(EP_CLSID))) + { + HANDLE hEvent0 = CreateEventW(NULL, FALSE, FALSE, _T(EP_SETUP_HELPER_SWITCH) L"_" _T(EP_CLSID)); + HANDLE hEvent1 = CreateEventW(NULL, FALSE, FALSE, _T(EP_SETUP_HELPER_SWITCH) L"_" _T(EP_CLSID) L"_1"); + if (hEvent0 && hEvent1) + { + SetEvent(hEvent1); + CloseHandle(hEvent1); + hEvent1 = NULL; + WaitForSingleObject(hEvent0, INFINITE); + CloseHandle(hEvent0); + hEvent0 = NULL; + StartExplorerWithDelay(1000); + } + if (hEvent1) + { + CloseHandle(hEvent1); + hEvent1 = NULL; + } + if (hEvent0) + { + CloseHandle(hEvent0); + hEvent0 = NULL; + } + return 0; + } + if (argc >= 1 && !_wcsicmp(wargv[0], L"/extract")) { if (argc >= 2) @@ -395,6 +422,22 @@ int WINAPI wWinMain( { bOk = TRUE; + HANDLE hEvent0 = CreateEventW(NULL, FALSE, FALSE, _T(EP_SETUP_HELPER_SWITCH) L"_" _T(EP_CLSID)); + HANDLE hEvent1 = CreateEventW(NULL, FALSE, FALSE, _T(EP_SETUP_HELPER_SWITCH) L"_" _T(EP_CLSID) L"_1"); + HRESULT hr = CoInitialize(NULL); + if (SUCCEEDED(hr)) + { + if (hEvent0 && hEvent1) + { + hr = ShellExecuteFromExplorer(wszOwnPath, _T(EP_SETUP_HELPER_SWITCH) L"_" _T(EP_CLSID), NULL, NULL, SW_SHOWNORMAL); + if (SUCCEEDED(hr)) + { + WaitForSingleObject(hEvent1, INFINITE); + } + } + CoUninitialize(); + } + BeginExplorerRestart(); Sleep(100); @@ -657,17 +700,24 @@ int WINAPI wWinMain( ); } - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\explorer.exe"); - Sleep(1000); - ShellExecuteW( - NULL, - L"open", - wszPath, - NULL, - NULL, - SW_SHOWNORMAL - ); + if (!hEvent0 || !hEvent1 || FAILED(hr)) + { + StartExplorerWithDelay(1000); + } + else + { + SetEvent(hEvent0); + } + if (hEvent1) + { + CloseHandle(hEvent1); + hEvent1 = NULL; + } + if (hEvent0) + { + CloseHandle(hEvent0); + hEvent0 = NULL; + } } return GetLastError();