powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Завершение программы без окна
20 сообщений из 20, страница 1 из 1
Завершение программы без окна
    #33874191
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть программа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
#include <windows.h>
#pragma hdrstop
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG	msg;
    UINT MyTimer;
    int interval;
    int needrepeat=- 1 ;

    interval= 500 ;
    MyTimer=SetTimer(NULL, 1 ,interval,NULL);

    while(GetMessage((LPMSG) &msg, NULL,  0 ,  0 ) & needrepeat)
        {
        switch (msg.message)
            {
            case WM_TIMER:
                      ................
                break;
            case WM_CLOSE, WM_DESTROY:
                      ................
                       Не приходят такие мессаджи :(
                      ................
                break;
            default:
                ;
            }
        TranslateMessage( (LPMSG) &msg );
        DispatchMessage( (LPMSG) &msg );
        }

    KillTimer(NULL,MyTimer);
    return  0 ;
}

Окон она не создаёт, как поймать момент когда её хотят закрыть?
Если завершение из Дебага по Ф2 или Из диспетчера задач - то естественно WM_CLOSE, WM_DESTROY не приходят, может есть ещё какие сообщения?
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33874229
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdio.h>
#include <stdlib.h>
void _atexit()
{
 printf("Exit!\n");
};

int main() {
atexit(_atexit);
while (true);
return  0 ;
}
man atexit
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33874280
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это работает только с main, а вот аналог с WinMain, не могу найти :(

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33874517
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если процесс прибивается из диспетчера задач, никакие сообщения ему не приходят. Вызывается TerminateProcess и все, кирдык. Вообще никакой код в этом процессе больше не выполняется.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33874913
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и при закрытии из-за окончания сессии, наверно также :(

а вот в NIXах шлётся TERM сигнал сначала, я думал(аю) может в винАпи тоже аналог есть. но как его найти?
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33874943
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то atexit() работает независимо от того консольная программа или оконная.
В оконных виндовых программах (которые с WinMain) функции упомянутые в atexit получают управление даже если программа умерла с GPF.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33875006
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 White Owl
не поже на правду :(
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33875045
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему не похоже? Похоже очень даже....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

void exit_function(void) {
	FILE *fp;
	fp = fopen("atexit.log", "a");
	fprintf(fp, "exit\n");
	fclose(fp);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) {
	FILE *fp;

	atexit(exit_function);

	fp = fopen("atexit.log", "w");
	fprintf(fp, "start\n");
	fclose(fp);
}
Компилируешь через cl atexit.c и в логе всегда видишь пару строчек.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33875053
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я проверял, но с простой компиляцией (С++Builder), и не работало, хоть atexit возвращала 0 при регистрации.

а как надо ?
флаги компилятору указать или ещё что ?

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33875099
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monsterя проверял, но с простой компиляцией (С++Builder), и не работало, хоть atexit возвращала 0 при регистрации.Как проверял? Взял код который показал alex_k и заменил в нем main на WinMain? Тогда действительно работать не будет. Потому что в оконной программе (которая с WinMain) не создается консоль и соответствующие ей stdin/stdout. А мой пример работает, потому что я пишу в самостоятельно созданый файл.
Никаких особых ключей не надо. Для Билдера хватит напоминания что надо делать оконное приложение (по умолчанию он делает консольное), а VC делает по умолчанию оконное.
Берешь мой пример и в командной строке:
> bcc32 -W atexit.c
или
> cl atexit.c
В обоих случаях получишь одинаково работающие atexit.exe.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33875127
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверял записью в файл + fflush,
а иначе бы была ошибка на printf.

а у вас ошибка, while не хватает, а иначе как прогу завершить принудительно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) {
    FILE *fp;

    atexit(exit_function);

    fp = fopen("atexit.log", "w");
    fprintf(fp, "start\n");
    fclose(fp);

while (1)
;

Код: plaintext
1.
}
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33875367
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам это зачем ? Хотите не дать принудительно завершить программу ?
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33878016
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну судя по самому первому посту,
я всё таки хочу просто сделать CleanShutDown.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33878025
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, в виндах самый универсальный способ сделать этот самый CleanShutdown это вынести все вещи требующие правильного закрытия в dll. И положить весь выгружающий код в DllMain(PROCESS_DETACH).
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33878291
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monsterНу судя по самому первому посту,
я всё таки хочу просто сделать CleanShutDown.Ну создайте окно. Или сделайте программу сервисом. Или напишите другую программу, которая будет посылать этой какое-нибудь сообщение с помощью PostThreadMessage.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33878293
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВообще, в виндах самый универсальный способ сделать этот самый CleanShutdown это вынести все вещи требующие правильного закрытия в dll. И положить весь выгружающий код в DllMain(PROCESS_DETACH).Ну да, только это не поможет msdn TerminateProsessDLLs attached to the process are not notified that the process is terminating
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33880603
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone White OwlВообще, в виндах самый универсальный способ сделать этот самый CleanShutdown это вынести все вещи требующие правильного закрытия в dll. И положить весь выгружающий код в DllMain(PROCESS_DETACH).Ну да, только это не поможет msdn TerminateProsessDLLs attached to the process are not notified that the process is terminating
Ась? А если заглянуть в тот же MSDN и прочитать описание DLL_PROCESS_DETACH, то:
MSDN:DllMain - DLL_PROCESS_DETACHThe DLL is being unloaded from the virtual address space of the calling process as a result of unsuccessfully loading the DLL, termination of the process , or a call to FreeLibrary.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33880885
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl WO> The DLL is being unloaded from the virtual address space
WO> of the calling process as a result of unsuccessfully
WO> loading the DLL, termination of the process, or a call to
WO> FreeLibrary.

А кто сказал, что при любом "терминэйшне" будет вызван DllMain, ась ? Делов-то на 5 минут - взять и проверить.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33880936
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасА кто сказал, что при любом "терминэйшне" будет вызван DllMain, ась ? Делов-то на 5 минут - взять и проверить.Так лениво же :)
Ну ладно... ща....
....
В пять минут не уложился. Целых десять потребовалось...
Похоже что MSDN врет :)
Нате, пробуйте.
...
Рейтинг: 0 / 0
Завершение программы без окна
    #33881065
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПохоже что MSDN врет :)
вот что в билдеровской справке написано:
Syntax

#include <stdlib.h>
int atexit(void (_USERENTRY * func)(void));

Description

Registers termination function.

atexit registers the function pointed to by func as an exit function. Upon normal termination of the program , exit calls func just before returning to the operating system. fcmp must be used with the _USERENTRY calling convention.

Each call to atexit registers another exit function. Up to 32 functions can be registered. They are executed on a last-in, first-out basis (that is, the last function registered is the first to be executed).

Return Value

atexit returns 0 on success and nonzero on failure (no space left to register the function).
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Завершение программы без окна
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]