咄咄怪事,一个MFC程序离开了VC6的CTRL+F5则无法正常运行
怪事,一个MFC程序离开了VC6的CTRL+F5则无法正常运行
一个简单的关机程序
通过outputdebugstring看能正常走到定时器回调里面去
但是无法执行::ExitWindowsEx(EWX_SHUTDOWN, EWX_FORCE);这个API。
如果在VC6中使用CTRL+F5带起来程序。才能正常执行流程。直接执行debug或release目录的执行文件则无法重启。这是为啥???
源码下载http://pan.baidu.com/s/1jGn71S6
------解决思路----------------------
还有用户权限问题,调试时获取的系统权限高,运行时权限低,xitWindowsEx(EWX_SHUTDOWN, EWX_FORCE)的表现可能不一样,这个函数在不同的操作系统里也有不同的表现
------解决思路----------------------
“调试时获取的系统权限高,运行时权限低”
所以提高 Privilege Level
------解决思路----------------------
一个简单的关机程序
通过outputdebugstring看能正常走到定时器回调里面去
但是无法执行::ExitWindowsEx(EWX_SHUTDOWN, EWX_FORCE);这个API。
如果在VC6中使用CTRL+F5带起来程序。才能正常执行流程。直接执行debug或release目录的执行文件则无法重启。这是为啥???
源码下载http://pan.baidu.com/s/1jGn71S6
------解决思路----------------------
还有用户权限问题,调试时获取的系统权限高,运行时权限低,xitWindowsEx(EWX_SHUTDOWN, EWX_FORCE)的表现可能不一样,这个函数在不同的操作系统里也有不同的表现
------解决思路----------------------
“调试时获取的系统权限高,运行时权限低”
所以提高 Privilege Level
------解决思路----------------------
bool AdjustPrivileges() {
HANDLE hToken;
TOKEN_PRIVILEGES tp;
TOKEN_PRIVILEGES oldtp;
DWORD dwSize=sizeof(TOKEN_PRIVILEGES);
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
------解决思路----------------------
TOKEN_QUERY, &hToken)) {
if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;
else return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
CloseHandle(hToken);
return false;
}
ZeroMemory(&tp, sizeof(tp));
tp.PrivilegeCount=1;
tp.Privileges[0].Luid=luid;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
/* Adjust Token Privileges */
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
CloseHandle(hToken);
return false;
}
// close handles
CloseHandle(hToken);
return true;
}