Не выключается комп
Софтовое выключение компа не работает с запущенной прогой, скомпилированной в BC++B 5.0.
Windows при таком выключении должна сама завершить все процессы и благополучно отключить компьютер. Завершение процессов останавливается после того, как завершается процесс самой программы... после этого не работает не PWR BUTTON, не START -> SHUTDOWN...
Среда:
WinXP Pro (w\o SP)
В приложении использованы стандартные компоненты BCB : Timer, NMHTTP, TrayIcon.
В чем проблема?
Заранее благодарен)
просто обнови систему, если с прогой не мудрил может поможет
=) Не поможет, пробовал на нескольких машинах, на всех та же фигня. Да и чета не очень то хочется в РИДМИ к моему МикроБлокноту писать что-то вроде этого:
QuickNotes 1.0
System requirements: WinXP SP1 (crtical)
=)
HANDLE hToken=NULL;
TOKEN_PRIVILEGES tkp;
hProcess=GetCurrentProcess();
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
MessageBox(NULL, "AdjustTokenPrivileges enable failed.", "Error", MB_OK);
ExitWindowsEx(EWX_POWEROFF, EWX_FORCE);
Завершение процессов останавливается после того, как завершается процесс самой программы...
Недавно я написал утилиту для выключения компа по таймеру.
Чтобы твой процесс завершался в последнюю очередь, впиши где угодно до запуска shutdown такую строчку:
[color=blue]SetProcessShutdownParameters(256, SHUTDOWN_NORETRY)[/color]
Я наткнулся на эту функцию нечаянно, когда копался на MSDN. Она сделает так, чтобы твоя програма завершалась последней среди других обычных программ. А системные сервисы и драйверы будут выгружены уже позже.
Сделай как советует Hearse.
Правда все строчки предложенного им кода, кроме самой последней, нужны только для WinNT/2000/XP. На Win9x/ME выскочит MessageBox, и выполнение программы остановится пока не будет нажата кнопка [OK]. Имей это ввиду, если пишешь под Win9x. Можно обойтись и без MessageBox'а. (Кстати, ShowMessage() отличается от MessageBox() тем, что не останавливает программу).
Теперь насчет последней строчки кода Hearse.
Тут он ошибся. Он имел ввиду вот это:
[color=blue]ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0);
[/color]
Но я рекомендовал бы сначала выполнить
[color=blue]ExitWindowsEx(EWX_POWEROFF, 0);[/color]
а потом, через минуту, выполнить EWX_POWEROFF|EWX_FORCE.
Почему? EWX_POWEROFF|EWX_FORCE просто тупо закрывает все приложения, и теоретически может случиться так, что кто-нибудь из программ потеряет свои несохраненные данные.
Теперь насчет последней строчки кода Hearse.
Тут он ошибся. Он имел ввиду вот это:
ExitWindowsEx(EWX_POWEROFF|EWX_FORC
E, 0);
Сорри, действительно:{