Я думаю, для многих не секрет, что в библиотеке shell32.dll есть функция под номером 60. Но не каждый знает, что эта функция выводит диалог завершения работы ОС.
Так вот, когда я её вызываю — диалог завершения работы выводится, но когда выбираю какое-нибудь действие, то диалог просто закрывается и ничего не происходит.
Почему?
Вот код:
typedef void (_stdcall *SHShutDownDialogProc)(HWND);
if(Надо вывести диалог завершения работы)
{
// получаем версию
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
// если 9x, то просто запоминаем в глобальной переменной
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
WinVer = VER_PLATFORM_WIN32_WINDOWS;
}
// если NT, то устанавливаем привилегии на завершение работы
else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
WinVer = VER_PLATFORM_WIN32_NT;
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
PrintError("OpenProcessToken");
if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid))
PrintError("LookupPrivilegeValue");
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0))
PrintError("AdjustTokenPrivileges");
}
//иначе ошибка
else
{
MessageBox(0,"Данная версия ОС не поддерживает эту операцию.",
0,MB_OK|MB_ICONSTOP);
return 1;
}
// ищем в shell32.dll функцию, которая выводит диалог завершения работы
// и вызываем её
SHShutDownDialogProc SHShutDownDialog;
HMODULE hDll;
hDll = LoadLibrary("shell32.dll");
if(!hDll)PrintError("LoadLibrary");
SHShutDownDialog = (SHShutDownDialogProc)GetProcAddress(hDll,(LPCSTR)60);
if(!SHShutDownDialog)PrintError("GetProcAddress");
SHShutDownDialog(GetDesktopWindow());
FreeLibrary(hDll);
}