我通过ShellExecuteEx启动exe:
tstring sPath = _T("C:\\Test\\MyApp.exe");
tstring sArgs = _T("/S");
SHELLEXECUTEINFO lpExecInfo = {0,};
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
lpExecInfo.lpFile = sPath.c_str();
lpExecInfo.fMask=SEE_MASK_NOASYNC ;
lpExecInfo.hwnd = NULL;
lpExecInfo.lpVerb = NULL;
lpExecInfo.lpParameters = sArgs.c_str();
lpExecInfo.lpDirectory = NULL;
lpExecInfo.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&lpExecInfo)) {
// handle the error
throw CException("Cannot launch an application");
}
int nRes = (int)lpExecInfo.hInstApp; // nRes = 42
DWORD dwErr = GetLastError(); // dwErr = 0
如何检测UAC是否取消了启动?在这种情况下,ShellExecuteEx成功(hInstApp = 42,GetLastError返回0)。
谢谢
最佳答案
如果ShellExecuteEx()
没有返回错误,那么您就无法检测到ShellExecuteEx's
控件之外发生的UAC取消。
您应该做的是改用CreateProcess()
。如果UAC拒绝新流程,则将返回错误。不要使用ShellExecuteEx()
启动.exe文件,除非您使用“runas”动词强制执行UAC提示。
关于c++ - 如何检测通过ShellExecuteEx启动是否被UAC取消,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7802155/