Страница 1 из 1

Заблокировать Shutdown

Добавлено: 28 ноя 2006, 18:54
Dr_Grizzly
Такая вот незадачка, на двух компах стоит бухгалтерская прога Парус, на одном как серверная часть, другой - клиент. И вот когда конец рабочего дня пользователь на серваке завершает работу, а клиент в это время в базе, и тут бац, и нарушение целостности. Вот и думаю написать прогу которая бы блокировала завершение работы компа пока второй пользователь не даст разрешения.

Вторую часть вопроса я смогу реализовать, а вот с блоком перезапуска даже и не знаю как, читал всякие мурзилки, есть вариант, но проблема в том что винда завершает все процессы пока не дойдет до нашего приложения и та не заблокирует завершение. Мне же надо отловить еще самое начало завершение работы, или хотя бы не дать выключится пока не завершен указанный процесс.

Список процессов я знаю как получить.

Re: Заблокировать Shutdown

Добавлено: 28 ноя 2006, 22:58
Хыиуду
Есть очень злобный вариант: в реестре можно прописать, чтобы Windows блокировал опцию "Завершение работы". Не помню, где конкретно, в инете надо порыться. Идея проста: когда клиент начинает работать с БД, он посылает сигнал серверу, и серверная часть блокирует у себя шутдаун. Когда работа с БД заканчивается - второй сигнал, шутдаун разблокируется. Проблем, видимых на первый взгляд, две:
1. От павера и резета все равно не поможет
2. Меня бы за такое уволили ;)

Re: Заблокировать Shutdown

Добавлено: 29 ноя 2006, 12:28
Absurd
Блин, не надо только реестра

Rtfm

Код: Выделить всё

WM_QUERYENDSESSION

Re: Заблокировать Shutdown

Добавлено: 29 ноя 2006, 19:36
Dr_Grizzly
Гы, я сам себе начальник, и как мне будет угодно, главное сделать :) А про кнопки и речь идти не может, пользователи прилежные :)

Про реестр, я тоже где-то слышал такое :) Идея не плохая

Можно про Wm_queryendsession по подробнее, как именно остановить завершение винды? Я так понимаю эта штука вернет только что пользователь захотел завершить сеанс... как я понимаю... :)

Re: Заблокировать Shutdown

Добавлено: 29 ноя 2006, 20:16
Absurd
Нет, дело в том что сообщения виндовс вообще-то могут обрабатываться синхронно и следовательно у них есть возвращаемое значение, которое вызывающий может проанализировать - Это результат функции SendMessage(). Если хотя бы одно приложение возвращает 0L, то shutdown должен быть отмененю

WM_QUERYENDSESSION
The WM_QUERYENDSESSION message is sent when the user chooses to end the session or when an application calls the ExitWindows function. If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

After processing this message, the system sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message.

A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_QUERYENDSESSION, // the message to send
WPARAM wParam, // not used
LPARAM lParam // logoff option
);
Parameters
wParam
This parameter is reserved for future use.
lParam
Specifies whether the user is logging off or shutting down the system. If this parameter includes the ENDSESSION_LOGOFF value, the user if logging off. (Note that this parameter is a bit mask. To test for this value, use a bit-wise operation; do not test for equality.)
Windows 2000/XP: If this parameter is zero, the system is shutting down.

Return Values
If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE.

Remarks
By default, the DefWindowProc function returns TRUE for this message.

Windows NT/2000/XP: When an application returns TRUE for this message, it receives the WM_ENDSESSION message and it is terminated, regardless of how the other applications respond to the WM_QUERYENDSESSION message.

Windows 95/98/Me: After all applications return TRUE for this message, they receive the WM_ENDSESSION and they are terminated.