Qt shutdown()无法在已部署的应用程序上运行

时间:2013-05-07 11:26:14

标签: c++ qt shutdown qt5

我制作了一个程序,在一段时间后关闭PC。 用户使用2个旋转框输入时间(一个用于小时,另一个用于分钟), 然后我把它转换为毫秒:

ms = (ui->hBox->text().toInt() * 3600 + ui->mBox->text().toInt() * 60) * 1000;

然后调用timer()函数

void Dialog::timer()
{
    QTimer *time = new QTimer(this);
    time->setInterval(ms);
    time->setSingleShot(1);
    connect(time, SIGNAL(timeout()), this, SLOT(shutdown()));
    time->start();
}

然后signal timeout()调用shutdown()插槽/函数,检查用户是否要关闭,重新启动或注销PC,然后执行适当的命令。

void Dialog::shutdown()
{
    if(ui->radioButton->isChecked())
        system("shutdown -s -t 0");
    else if(ui->radioButton_2->isChecked())
        system("shutdown -r -t 0");
    else if(ui->radioButton_3->isChecked())
        system("shutdown -l -t 0");
}

(也试过“shutdown -s -f”,甚至只有“shutdown -s”,似乎没有什么能帮助解决问题)

我想只在我的Windows PC上运行此应用程序,因此使用system()也不是问题。

当我从Qt Creator运行它时,上面的应用程序执行得很好,但是当我部署它时,放入所有需要的.dll文件,程序等待计时器然后只打开空控制台然后启动程序的新实例,PC永远不要关闭或重启。 那么我做错了什么?我错过了一些.dll文件吗?

2 个答案:

答案 0 :(得分:2)

一个简单的解决方法是将已部署的exe重命名为: shut .exe或任何代替 shutdown .exe,然后系统将执行它的关闭命令,而不是再次执行您的应用程序。

LE:可能还有其他方法可以解决这个问题,但我没有对此进行过调查......所以也要保持其他解决方案;)

答案 1 :(得分:0)

使用system()是不安全的。更好的解决方案是使用Win32 API调用ExitWindowEx()。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx

当然,因为这只是windows,所以你必须为Windows平台#ifdef。

#ifdef Q_OS_WIN
#include "qt_windows.h"
if ( !ExitWindowsEx(EWX_SHUTDOWN,0)) // Or EWX_FORCE
{
  // Failed, call GetLastError() to know why
}
#endif

编辑:您还需要正确的权限:

How to turn off pc via windows API?