Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Завершение программы без окна / 20 сообщений из 20, страница 1 из 1
24.07.2006, 15:28
    #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
24.07.2006, 15:37
    #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
24.07.2006, 15:48
    #33874280
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
это работает только с main, а вот аналог с WinMain, не могу найти :(

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

а вот в NIXах шлётся TERM сигнал сначала, я думал(аю) может в винАпи тоже аналог есть. но как его найти?
...
Рейтинг: 0 / 0
24.07.2006, 19:02
    #33874943
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
Вообще-то atexit() работает независимо от того консольная программа или оконная.
В оконных виндовых программах (которые с WinMain) функции упомянутые в atexit получают управление даже если программа умерла с GPF.
...
Рейтинг: 0 / 0
24.07.2006, 19:32
    #33875006
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
2 White Owl
не поже на правду :(
...
Рейтинг: 0 / 0
24.07.2006, 20:01
    #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
24.07.2006, 20:10
    #33875053
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
я проверял, но с простой компиляцией (С++Builder), и не работало, хоть atexit возвращала 0 при регистрации.

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

IMHO, Mon$te®
...
Рейтинг: 0 / 0
24.07.2006, 21:02
    #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
24.07.2006, 21:24
    #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
25.07.2006, 06:33
    #33875367
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
Вам это зачем ? Хотите не дать принудительно завершить программу ?
...
Рейтинг: 0 / 0
25.07.2006, 20:07
    #33878016
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
Ну судя по самому первому посту,
я всё таки хочу просто сделать CleanShutDown.
...
Рейтинг: 0 / 0
25.07.2006, 20:21
    #33878025
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
Вообще, в виндах самый универсальный способ сделать этот самый CleanShutdown это вынести все вещи требующие правильного закрытия в dll. И положить весь выгружающий код в DllMain(PROCESS_DETACH).
...
Рейтинг: 0 / 0
26.07.2006, 07:30
    #33878291
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
4d_monsterНу судя по самому первому посту,
я всё таки хочу просто сделать CleanShutDown.Ну создайте окно. Или сделайте программу сервисом. Или напишите другую программу, которая будет посылать этой какое-нибудь сообщение с помощью PostThreadMessage.
...
Рейтинг: 0 / 0
26.07.2006, 07:32
    #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
26.07.2006, 18:22
    #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
26.07.2006, 22:23
    #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
26.07.2006, 23:57
    #33880936
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Завершение программы без окна
Карабас БарабасА кто сказал, что при любом "терминэйшне" будет вызван DllMain, ась ? Делов-то на 5 минут - взять и проверить.Так лениво же :)
Ну ладно... ща....
....
В пять минут не уложился. Целых десять потребовалось...
Похоже что MSDN врет :)
Нате, пробуйте.
...
Рейтинг: 0 / 0
27.07.2006, 07:28
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Завершение программы без окна / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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