- 論壇徽章:
- 0
|
vc++6.0下采用了兩種windows的關(guān)機(jī)的代碼(附在后面),均可以在win2000下順利關(guān)機(jī)。
但把程序的可執(zhí)行文件(f.exe)拷貝到linux下通過(guò)kernel-win32來(lái)執(zhí)行,卻不能關(guān)機(jī)(雖然程序中的其他功能可以實(shí)現(xiàn))。當(dāng)程序運(yùn)行到關(guān)機(jī)的那些代碼時(shí),只是簡(jiǎn)單的關(guān)閉當(dāng)前的應(yīng)用程序窗口。
現(xiàn)在的問(wèn)題是:
1。windows下還有沒(méi)有其他的“實(shí)現(xiàn)關(guān)機(jī)功能的代碼”?也許那些代碼可以在kernel-win32下關(guān)閉計(jì)算機(jī)
2。有沒(méi)有其他的辦法實(shí)現(xiàn)如下功能:在vc6程序中編程,轉(zhuǎn)到linux下關(guān)機(jī)
3. 腦子里有一個(gè)思路但不知怎么實(shí)現(xiàn),請(qǐng)高手指點(diǎn)一二,謝謝。
思路如下:在linux下編寫一個(gè)程序a,a實(shí)現(xiàn)功能如下:
(1)調(diào)用通過(guò)kernel-win32調(diào)用我的vc下的可執(zhí)行程序f.exe(這個(gè)步驟已經(jīng)實(shí)現(xiàn)了)
(2)當(dāng)f.exe退出后,調(diào)用linux下關(guān)機(jī)的命令(如:system("sudo halt -f -p")),但這樣帶來(lái)的問(wèn)題是需要輸入超級(jí)用戶的密碼。
對(duì)于步驟(2)的要求是:(a)已經(jīng)知道超級(jí)用戶的密碼,(b)但不能出現(xiàn)輸入密碼的過(guò)程(希望輸入密碼的過(guò)程由自己編程序來(lái)自動(dòng)完成)
//.........程序中的2種關(guān)機(jī)代碼如下.....
bool MySystemShutDown1()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
return FALSE;
return TRUE;
}
//.............
void MySystemShutDown2()
{
// TODO: Add your control notification handler code here
OSVERSIONINFO OsInfo;
OsInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OsInfo);
if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
//MessageBox("");
return;
}
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[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)
{
//MessageBox("");
return;
}
if(!ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0))
{
//MessageBox("");
}
}
} |
|