Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ExitWindowsEx() ???


Автор: qaz 29.3.2002, 20:28
Чем можно заменить ф-цию ExitWindpwsEx (ShutDown) и ExitWindpwsEx (Reboot) - в 98 сносно работает, но в ХР  только LogOff делает вместо всего этого. Как быть?

Автор: Garik 29.3.2002, 21:22
Скажу сразу, сам не пробовал и не знаю, прокатит ли это в ХР, но есть еще такой вариант:
rundll32 shell32,SHExitWindowsEx 1 - выключение
rundll32 shell32,SHExitWindowsEx 2 - перезагрузка.
Ну, а запускать через ShellExecute например.

Автор: Vit 29.3.2002, 21:47
Я тоже подумал об этом способе, но XP что-то не очень хочет так делать.

Автор: qaz 30.3.2002, 07:53
Не хотить!
No such entry in shel32 :angry:
Ещё какие нить варианты будут?

Автор: Vit 30.3.2002, 09:03
Была такая еще функция, только я не помню где ExitKernel, по моему то-ли в User.EXE то ли в чем то подобном. Поищи по системным файлам в списках экспортируемых функций. Незнаю как в XP а предыдущих виндах закрывала винды мгновенно и без запросов, правда не давала и другим программам что либо закрыть. Кстати, а посылать Explorer сообщение wm_quit не пробовали?

Автор: VitSoft 30.3.2002, 11:37
да все работает

ExitWindowsEx:
...
Windows NT/2000/XP: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges.

HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Get a token for this process.

if (!OpenProcessToken(GetCurrentProcess(),
       TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
   error("OpenProcessToken");

// 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);

// Cannot test the return value of AdjustTokenPrivileges.

if (GetLastError() != ERROR_SUCCESS)
   error("AdjustTokenPrivileges");

// Shut down the system and force all applications to close.

if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
   error("ExitWindowsEx");

:sneaky2

Good Luck VitSoft
http://www.development.efficientit.com

Автор: qaz 4.4.2002, 19:52
Вот это работает. Сенкс.
Только вот ещёё одна проблемма: при запуске функции ExitWindowsEx() в 98 комп сам вырубался без никаких вопросов (типа "теперь питание можно выключить"), а по предложенной схеме ХР умничать начинает - что теперь вам всё дозволено и выключайте комп руками .... Как от этого избавиться можно?

Автор: neutrino 4.4.2002, 20:00
Тут, мне кажется, уже надо писат Биллу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)