2013-05-07 76 views
0

我制作了一个程序,可在设定的时间后关闭PC。 用户使用2个旋转框(一个用于小时,另一个用于分钟), 然后我将其转换为毫秒进入时间:Qt关机()不适用于已部署的应用程序

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

然后它调用计时器()函数

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

然后信号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"); 
} 

(也试过“关机-s -f”,甚至只有“关机-s”,似乎没有任何帮助解决问题)

我想只有我的Windows PC上运行该应用程序,所以使用system()也不是问题。

当我从Qt Creator运行它时,上面的应用程序执行完美,但是当我部署它时,放置所有需要的.dll文件,程序等待计时器,然后打开空控制台,然后启动程序的新实例, PC从不关闭或重新启动。 那么我在做什么错了?我是否缺少一些.dll文件或其他内容?

+0

你有没有使用依赖学步车检查任何缺少DLL? – 2013-05-07 11:29:25

+0

是的,我做了,它报告我拥有了一切。我需要把qudows.dll的icudt49,icuin49,icuuc49,libEGL,libgcc_s_sjlj-1,libGLESv2,libstdC++ - 6,libwinpthread,Qt5Core,Qt5Gui,Qt5Widgets和platforms文件夹 – Svajs 2013-05-07 11:32:17

回答

2

一个简单的解决方法是重新命名您的exe文件部署到类似: .exe或任何东西,而不是关机的.exe,那么系统将执行它的关机命令,而不是再次执行您的应用程序。

LE:可能有其他的方法来解决这个问题,但我没有调查这...所以保持紧密联系其他的解决方案也;)

+0

非常感谢,我永远不会想到这个解决方案。我甚至不知道为什么我觉得把它叫做shutdown.exe是一个好主意。至少现在我永远不会忘记这一点。 – Svajs 2013-05-07 12:25:17

0

使用system()是不安全的。解决您的问题的更好办法是使用Win32 API调用ExitWindowEx()。

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

,因为这当然是仅适用于Windows,你不得不它支持#ifdef为Windows平台。

#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?

+0

它似乎没有做任何事情,甚至没有我从Qt Creator运行程序。我包括,我需要做其他事情吗? – Svajs 2013-05-07 11:47:46

+0

ExitWindowsEx的返回值是什么? – paulm 2013-05-07 11:55:23

+0

看到我的编辑,还有一些工作要做 – paulm 2013-05-07 11:56:28

相关问题