WUIsBack/shared/Exec.c

44 lines
1.1 KiB
C

#include "stdafx.h"
#include "Exec.h"
HRESULT Exec(LPWSTR verb, LPWSTR file, LPWSTR params, LPWSTR workingDir, WORD show, BOOL wait, LPDWORD exitCode) {
SHELLEXECUTEINFO execInfo = {0};
execInfo.cbSize = sizeof(execInfo);
execInfo.lpVerb = verb;
execInfo.lpFile = file;
execInfo.lpParameters = params;
execInfo.lpDirectory = workingDir;
execInfo.nShow = show;
return ExecEx(&execInfo, wait, exitCode);
}
HRESULT ExecEx(LPSHELLEXECUTEINFO execInfo, BOOL wait, LPDWORD exitCode) {
if (wait) {
execInfo->fMask |= SEE_MASK_NOCLOSEPROCESS;
}
if (!ShellExecuteEx(execInfo)) {
return HRESULT_FROM_WIN32(GetLastError());
}
HRESULT hr = S_OK;
if (wait) {
if (execInfo->hProcess == NULL) {
TRACE(L"ShellExecuteEx() didn't return a handle: %u", GetLastError());
hr = E_FAIL;
}
WaitForSingleObject(execInfo->hProcess, INFINITE);
if (exitCode != NULL && GetExitCodeProcess(execInfo->hProcess, exitCode) == 0) {
hr = HRESULT_FROM_WIN32(GetLastError());
TRACE(L"GetExitCodeProcess() failed: %p\n", hr);
}
CloseHandle(execInfo->hProcess);
}
return hr;
}