Сам спросил и сам ответил )
SetProcessShutdownParameters(0, SHUTDOWN_NORETRY);
это хоть и не все, но решает. Просто деинициализацию надо завершить до окончания функции обработки сигнала - по выходу из функции программа падает.
Я сделал примерно так:
HANDLE hStopProgram_Command;
int main(int argc, char* argv[]){
DWORD dRes;
hStopProgram_Command = CreateEvent(NULL, TRUE, FALSE, NULL);
SetProcessShutdownParameters(0, SHUTDOWN_NORETRY);
if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE) {
// unable to install handler.display message to the user
dRes = GetLastError();
printf("(MAIN): Unable to install handler! (err = %i)\n", dRes);
return -1;
}
while (true) {
dRes = WaitForSingleObject(hStopProgram_Command, 10000L);
if (dRes != WAIT_ABANDONED) break;
}
printf("Stop_program signal handled! Press OK button in msg to terminate program...\n");
MessageBox(0,"Press OK!!!", "Stopping",0);
return 0;
} /* */
BOOL WINAPI ConsoleHandler(DWORD CEvent) {
switch(CEvent) {
case CTRL_CLOSE_EVENT:
printf("exit\n");
break;
// тут обработка остальных сигналов
}
SetEvent(hStopProgram_Command);
while (true);
return TRUE;
}
т.е., функция ConsoleHandler только ставит в сигнальное состояние событие hStopProgram_Command и "зависает", а в главном потоке - ждем это событие и завершаем работу программы.
Остается только непонятным первый параметр функции SetProcessShutdownParameters - dwLevel...
MSDN:
dwLevel
[in] Shutdown priority for a process relative to other processes in the system. The system shuts down processes from high dwLevel values to low. The highest and lowest shutdown priorities are reserved for system components. This parameter must be in the following range of values. Value Meaning
000–0FF System reserved last shutdown range.
100–1FF Application reserved last shutdown range.
200–2FF Application reserved "in between" shutdown range.
300–3FF Application reserved first shutdown range.
400–4FF System reserved first shutdown range.
All processes start at shutdown level 0x280.