Делать неубиваемый процесс очень просто.
Перед тем, как убить винда сначала попытается завершить
его по-хорошему. Тут он и должен запустить свою копию
и передать ей все нужные данные перед благополучным
завершением.
прогу нельзя убить...
Код:
А вот код который там приведен..
Код:
LRESULT WINAPI WndProc(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
//HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy);
//HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnSize);
//HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand);
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
void WndProc_OnDestroy(HWND hWnd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
// Создадим другой процесс, а этот благополучно завершим.
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
CreateProcess(NULL, "program.exe", NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
PostQuitMessage(0);
//return FORWARD_WM_DESTROY(hWnd, DefWindowProc);
}
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
//HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy);
//HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnSize);
//HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand);
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
void WndProc_OnDestroy(HWND hWnd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
// Создадим другой процесс, а этот благополучно завершим.
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
CreateProcess(NULL, "program.exe", NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
PostQuitMessage(0);
//return FORWARD_WM_DESTROY(hWnd, DefWindowProc);
}
Суть вопроса состоит в том в каком типе проекта этот код реализовать,
я пробовал в консольное загонял, пишит ошибки.
Подскажите кто знает..
Пока в коде нет main|/WinMain программы не получится.
это функция для перезапуска приложения
Код:
void WndProc_OnDestroy(HWND hWnd)
а это её вызов при получении сообщения WM_DESTROY
Код:
HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy);
Я имею ввиду дальше.
Valiant-> Получается что WM_DESTROY - вызов функции void WndProc_OnDestroy(HWND hWnd). так получается.
Но вот еще какая проблемка. Когда я начинаю компилить этот код,
билдер говорит мне мол ошибка. Типа че такое "void WndProc_OnDestroy(HWND hWnd)"
И я вот думаю его ведб как класс нужно прописать, или нужно что то другое подправить.
И что тогда такое функция Swich?
Код:
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void WndProc_OnDestroy(HWND hWnd);
... WinMain(...)
{
}
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
...
}
void WndProc_OnDestroy(HWND hWnd)
{
...
}
void WndProc_OnDestroy(HWND hWnd);
... WinMain(...)
{
}
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
...
}
void WndProc_OnDestroy(HWND hWnd)
{
...
}
switch -- оператор в C++. Кури литературу
Купите(скачайте) книгу по С++, к примеру Бьерн Страуступ "Язык программирования С++"... После изучения оной приступайте к изучению оконной процедуры.
З.Ы. А вообще влюбом случае прогу можно будет убить....ресетом.
По-моему, для таких хитрож****, в винде есть такая штука, как "Завершить дерево процессов".
Цитата: Dart Bobr
По-моему, для таких хитрож****, в винде есть такая штука, как "Завершить дерево процессов".
А еще можно через ProcessExplorer потихоньку все нитки процесса терминировать.
Цитата: Patr1ot
WinMain, будет в начале консольного приложения.
Я имею ввиду дальше.
Valiant-> Получается что WM_DESTROY - вызов функции void WndProc_OnDestroy(HWND hWnd). так получается.
Но вот еще какая проблемка. Когда я начинаю компилить этот код,
билдер говорит мне мол ошибка. Типа че такое "void WndProc_OnDestroy(HWND hWnd)"
И я вот думаю его ведб как класс нужно прописать, или нужно что то другое подправить.
И что тогда такое функция Swich?
Я имею ввиду дальше.
Valiant-> Получается что WM_DESTROY - вызов функции void WndProc_OnDestroy(HWND hWnd). так получается.
Но вот еще какая проблемка. Когда я начинаю компилить этот код,
билдер говорит мне мол ошибка. Типа че такое "void WndProc_OnDestroy(HWND hWnd)"
И я вот думаю его ведб как класс нужно прописать, или нужно что то другое подправить.
И что тогда такое функция Swich?
оконные сообщения потому и называються оконными - потому что посылаються они окнам. Т.е. в консоли надо использовать другое решение.
WndProc_OnDestroy(HWND hWnd) - собитие возникающее при попытке закрыть окно - в билдере ему соотвествует OnDestroy
SetConsoleCtrlHandler. Но от завершения процесса это не спасёт. По-хорошему винда завершает при нажатии крестика или если в диспетчере задач на закладке "Приложения" нажимать "Снять задачу".
В консольной проге можно использовать
Решения:
1. Не давать юзеру открыть Диспетчер задач путем нахождения окна
Диспетчера и его закрытия с предупреждением:
"Не лезь..."
2. Прогу писать в виде драйвера.
Первое сделал, до второго умом не дошел.
Цитата: George22
Думал, думал: Как же не дать юзеру убить мою прогу?
Решения:
1. Не давать юзеру открыть Диспетчер задач путем нахождения окна
Диспетчера и его закрытия с предупреждением:
"Не лезь..."
2. Прогу писать в виде драйвера.
Первое сделал, до второго умом не дошел.
Решения:
1. Не давать юзеру открыть Диспетчер задач путем нахождения окна
Диспетчера и его закрытия с предупреждением:
"Не лезь..."
2. Прогу писать в виде драйвера.
Первое сделал, до второго умом не дошел.
По-моему не лучший вариант. Есть масса альтернатив Диспетчеру задач. Так что пытливый юзер вашу прогу все равно убьет :)
если он пытается закрыть мою прогу -не дам.
Написал и сам удивился!