我是初学VC的,请大家拉我一把,谢谢(在线求助) 我的程序中用到ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF,0)在98下可以关掉计算机,但到WIN2000下运行却没有反应,这是什么原因?如果想关掉机器,有没有别的API?是不是我的参数写错了?谢谢您! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是关机的代码:HANDLE hToken;TOKEN_PRIVILEGES tkp;BOOL fResult; //打开与当前进程相关联的存取标识 if (!::OpenProcessToken(GetCurrentProce(),TOKEN_ADJUST_PRIVILEGES |TOKEN_QUERY,&hToken)) AfxMessageBox("OpenProcessToken failed"); //查出本机系统的当前特权的Luid::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privilege[0].Luid);tkp.PrivilegeCount =1;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;::AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);if (::GetLastError()!=ERROR_SUCCESS)AfxMessageBox("AdjustTokenPrivileges enable failed");fResult = ::InitiateSystemShutdown(NULL,"即将关机",20,FALSE, TRUE);if (!fResult) AfxMessageBox("InitiateSystemShutDown failed");tkp.Privileges[0].Attributes = 0;::AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);if (::GetLastError()!=ERROR_SUCCESS) AfxMessageBox("AdjustTokenPrivileges disable failed"); 代码那么长,在这里没法贴啊你知道关机的API吗 为什么在98下这个API可以,在2000下却不起作用请大家拉我一把谢谢 2000与98不一样,程序如下:void WINAPI ExitWin() { DWORD dwVer; HANDLE hProcess, hToken; TOKEN_PRIVILEGES NewState; DWORD ProcessId, ReturnLength = 0; LUID luidPrivilegeLUID; dwVer=GetOS(); if(dwVer==VER_PLATFORM_WIN32_WINDOWS) ExitWindowsEx(1,0); else if(dwVer==VER_PLATFORM_WIN32_NT) { ProcessId = GetCurrentProcessId(); hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId); OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luidPrivilegeLUID); NewState.PrivilegeCount = 1; NewState.Privileges[0].Luid = luidPrivilegeLUID; NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL)) ExitWindowsEx(EWX_FORCE|EWX_POWEROFF,0); } } DWORD WINAPI GetOS() { OSVERSIONINFO os; TCHAR sVersion[MAX_PATH]; os.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&os); switch(os.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: return VER_PLATFORM_WIN32_WINDOWS; case VER_PLATFORM_WIN32_NT: return VER_PLATFORM_WIN32_NT; } } 谢谢!是不是没有在98下和2000下都能用的关机API?麻烦了! 请教 图层"显示/隐藏"操作 的一个问题 问了几个问题,分都耗尽了,答案也没有,大虾们帮忙,急用..如何删除一个文件在不知道文件名的情况下? COMBO控件申请,声明一个CComBox aa;变量后,怎么只显示了第一个数据,点击下拉怎么不显示? 如何查看局域网中一台计算机资源? 请问一个作用域问题 关于硬件扫描...... HIV——是什么东西? 送给自己的分 十晚火急!!如何实现象金山词霸一样的数据结构呢,有源程序最好!! 使用传统剪贴板怎么处理cstring 怎样制作平面按钮?谢谢! 谁有水晶报表的用法的资料??????????
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL fResult;
//打开与当前进程相关联的存取标识
if (!::OpenProcessToken(GetCurrentProce(),TOKEN_ADJUST_PRIVILEGES
|TOKEN_QUERY,&hToken))
AfxMessageBox("OpenProcessToken failed");
//查出本机系统的当前特权的Luid
::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privilege[0].Luid);
tkp.PrivilegeCount =1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);
if (::GetLastError()!=ERROR_SUCCESS)
AfxMessageBox("AdjustTokenPrivileges enable failed");
fResult = ::InitiateSystemShutdown(NULL,"即将关机",20,FALSE,
TRUE);
if (!fResult)
AfxMessageBox("InitiateSystemShutDown failed");
tkp.Privileges[0].Attributes = 0;
::AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);
if (::GetLastError()!=ERROR_SUCCESS)
AfxMessageBox("AdjustTokenPrivileges disable failed");
你知道关机的API吗
在2000下却不起作用
请大家拉我一把
谢谢
void WINAPI ExitWin()
{
DWORD dwVer;
HANDLE hProcess, hToken;
TOKEN_PRIVILEGES NewState;
DWORD ProcessId, ReturnLength = 0;
LUID luidPrivilegeLUID; dwVer=GetOS();
if(dwVer==VER_PLATFORM_WIN32_WINDOWS)
ExitWindowsEx(1,0); else if(dwVer==VER_PLATFORM_WIN32_NT)
{
ProcessId = GetCurrentProcessId();
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luidPrivilegeLUID); NewState.PrivilegeCount = 1;
NewState.Privileges[0].Luid = luidPrivilegeLUID;
NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL))
ExitWindowsEx(EWX_FORCE|EWX_POWEROFF,0);
}
} DWORD WINAPI GetOS()
{
OSVERSIONINFO os;
TCHAR sVersion[MAX_PATH]; os.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&os);
switch(os.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
return VER_PLATFORM_WIN32_WINDOWS; case VER_PLATFORM_WIN32_NT:
return VER_PLATFORM_WIN32_NT;
}
}
是不是没有在98下和2000下都能用的关机API?
麻烦了!