免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1301 | 回复: 0
打印 上一主题 下一主题

急!】vc++6.0的程序通过kernel-win32在linux下运行,却无法在程序中关机,怎么办? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-08 22:38 |只看该作者 |倒序浏览
vc++6.0下采用了两种windows的关机的代码(附在后面),均可以在win2000下顺利关机。
但把程序的可执行文件(f.exe)拷贝到linux下通过kernel-win32来执行,却不能关机(虽然程序中的其他功能可以实现)。当程序运行到关机的那些代码时,只是简单的关闭当前的应用程序窗口。
现在的问题是:
1。windows下还有没有其他的“实现关机功能的代码”?也许那些代码可以在kernel-win32下关闭计算机
2。有没有其他的办法实现如下功能:在vc6程序中编程,转到linux下关机
3. 脑子里有一个思路但不知怎么实现,请高手指点一二,谢谢。
   思路如下:在linux下编写一个程序a,a实现功能如下:
  (1)调用通过kernel-win32调用我的vc下的可执行程序f.exe(这个步骤已经实现了)
  (2)当f.exe退出后,调用linux下关机的命令(如:system("sudo halt -f -p")),但这样带来的问题是需要输入超级用户的密码。

   对于步骤(2)的要求是:(a)已经知道超级用户的密码,(b)但不能出现输入密码的过程(希望输入密码的过程由自己编程序来自动完成)

//.........程序中的2种关机代码如下.....
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("");
                }
        }

}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP