Russian Qt Forum

Qt => Общие вопросы => Тема начата: yunixon от Апрель 15, 2009, 12:40



Название: Кроссплатформенный reboot или shutdown
Отправлено: yunixon от Апрель 15, 2009, 12:40
Может есть какой-нибудь класс для работы с системой? Хочется загнать и линух и винду в ребут используя Qt.


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: pastor от Апрель 15, 2009, 12:50
нет такого класса, реализовывай сам на АПИ платформы


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: Alex03 от Апрель 15, 2009, 18:11
Кроссплатформенный способ - запуск внешнего процесса, а уж командлайн хранить в конфиге проги.


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: ax от Апрель 16, 2009, 13:17
Пользую
Выключить комп - команды
Windows
cmd /c shutdown  -s -t 0
Linux
sudo halt  // ест-но права root

Перезагрузить комп - команды
Windows
cmd /c shutdown  -r -t 0
Linux
sudo reboot


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: Rcus от Апрель 16, 2009, 14:03
Справка по ExitWindowsEx говорит что без привелегии SE_SHUTDOWN_NAME отключить компьютер не получится.


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: yunixon от Апрель 16, 2009, 14:57
еще в линухе есть вот такой костыль: system("init 0") (помоему в stdlib)
а в винде?


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: Hellraiser от Апрель 16, 2009, 18:43
Вот рабочий код для Windows
Код
C++ (Qt)
DWORD rebootWin()
{
   HANDLE hToken;
   TOKEN_PRIVILEGES tkp;
   DWORD dwRetVal;
 
// Получаем маркер (token) для этого процесса.
 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    return (GetLastError());
 
// Получаем LUID для привилегии выключения (shutdown).
 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
// Получаем привилегию выключения (shutdown) для этого процесса.
 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
 if ((dwRetVal = GetLastError()) != ERROR_SUCCESS) return dwRetVal;
 
// Выключаем или перезагружаем в соответствие с ExitFlags
 if (!ExitWindowsEx(EWX_LOGOFF|EWX_REBOOT, 0)) return (GetLastError());
}


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: yunixon от Апрель 17, 2009, 08:15
а чтоб mingw-шный компилер понял сей код, какой заголовок нужен? windows.h?


Название: Re: Кроссплатформенный reboot или shutdown
Отправлено: spirit от Апрель 17, 2009, 08:37
qt_windows.h