2013-05-07 75 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

相關問題