powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как корректно завершить программу
11 сообщений из 11, страница 1 из 1
Как корректно завершить программу
    #39969863
IlyamI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <Windows.h>
#include <WinUser.h>

INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)

{
    LPSTR message = "Мое сообщение";
    LPSTR caption = "Мой заголовок";

    MessageBox(0, message, caption, MB_OK);

    return 0;

}


команды сборки:
Код: plaintext
1.
2.
cl main.cpp /nologo /c /O1
link /nologo /ENTRY:WinMain /NODEFAULTLIB /SUBSYSTEM:WINDOWS main.obj user32.lib


При запуске выводится окно сообщения. После нажатия на кнопку "ОК" процесс остается в памяти и висит фоновым. Приходится убивать вручную.
Насколько корректно его закрывать вызовом ?
Код: plaintext
1.
ExitProcess(NOERROR)
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969865
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IlyamIНасколько корректно его закрывать вызовом ?

Лучше так не делать. Убери из строки сборки ключ ENTRY.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969869
IlyamI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Лучше так не делать. Убери из строки сборки ключ ENTRY.

LINK : error LNK2001: неразрешенный внешний символ "WinMainCRTStartup"

Хочу оставить в файле минимум необходимого
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969873
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IlyamILINK : error LNK2001: неразрешенный внешний символ "WinMainCRTStartup"

Убери ещё и NODEFAULTLIB. Не на твоём уровне создавать barebone программы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969876
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

IlyamIНасколько корректно его закрывать вызовом ?

Лучше так не делать. Убери из строки сборки ключ ENTRY.

Может там /NODEFAULTLIB играет? Это же вроде отключение CRT, т.е. отключили стандартную библиотеку вместе с кодом завершения приложения. Тогда ExitProcess() выглядит логичным.
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969884
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravТогда ExitProcess() выглядит логичным.

Так-то оно да, но во-первых, процесс таки должен завершаться после завершения последнего
потока (то есть что-то там ещё не так), а во-вторых, нужно всю программу написать без
капли рантайма, а на это способен не каждый (лично я - точно нет).

Я даже понятия не имею какую сигнатуру должна иметь голая точка входа. Подозреваю, что это
может быть вообще "void foo()".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969898
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravТогда ExitProcess() выглядит логичным.

Так-то оно да, но во-первых, процесс таки должен завершаться после завершения последнего
потока (то есть что-то там ещё не так)...
О корректном выходе из своих потоков в любом случае нужно самостоятельно заботится. А так приложение завершается после выхода из основного потока. Остальные просто убиваются.

Dimitry Sibiryakov
а во-вторых, нужно всю программу написать без
капли рантайма, а на это способен не каждый (лично я - точно нет).

Так там ничего сложного, в WinAPI есть все аналоги стандартной библиотеки. Функции строк/памяти/мьютексов и т.д. Там, кажется, только тригонометрии нет.

Dimitry Sibiryakov
Я даже понятия не имею какую сигнатуру должна иметь голая точка входа. Подозреваю, что это
может быть вообще "void foo()".

Там есть несколько стандартных сигнатур функции WinMain(). Собственно один из этих вариантов у ТС в коде.
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969901
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravА так приложение завершается после выхода из основного потока. Остальные просто убиваются.

Авотхрен. Это как раз поведение стандартной CRT, которая по выходу из main() вызывает
ExitProcess(). А barebone процессы завершаются только после завершения всех потоков, у них
нет главного. Это Рихтер пишет в первых же главах.

petrav
Там есть несколько стандартных сигнатур функции WinMain().

Авотопятьхрен. Это снова поведение стандартных заголовков CRT.

https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol?view=vs-2019
The function must be defined to use the __stdcall calling convention. The parameters and return value depend on if the program is a console application, a windows application or a DLL.
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969924
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
petravА так приложение завершается после выхода из основного потока. Остальные просто убиваются.

Авотхрен. Это как раз поведение стандартной CRT, которая по выходу из main() вызывает
ExitProcess(). А barebone процессы завершаются только после завершения всех потоков, у них
нет главного. Это Рихтер пишет в первых же главах.
Давно читал Рихтера... Не помню там такого.

Ну вот сейчас человек в конце функции main() вызовет руками ExitProcess() и чем это будет отличаться от поведения CRT? Можно, конечно, порассуждать, что если мы подгрузили некую библиотеку Windows, а она создала свой технологический поток и его нужно как-то корректно завершить... иначе всё песец. Но я сильно сомневаюсь в этом. Дескрипторы файлов на запись закрыл и можно прощаться.

Dimitry Sibiryakov
petrav
Там есть несколько стандартных сигнатур функции WinMain().

Авотопятьхрен. Это снова поведение стандартных заголовков CRT.

https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol?view=vs-2019
The function must be defined to use the __stdcall calling convention. The parameters and return value depend on if the program is a console application, a windows application or a DLL.

А что вы понимаете под CRT? Я понимаю стандартные библиотеки Си/С++, но тут то от них отказываются. Естественно о деструкторах глобальных объектов можно (нужно) забыть. Действительно есть несколько стандартных сигнатур WinMain(). Именно с них стартует приложение, а совсем не с main().
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39969928
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЕстественно о деструкторах глобальных объектов можно (нужно) забыть.

И о конструкторах. И о memory manager. И вообще о всём stdio.h. Об исключениях и прочих
плюсах можно даже не вспоминать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как корректно завершить программу
    #39970035
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IlyamI
INK : error LNK2001: неразрешенный внешний символ "WinMainCRTStartup"

возможно это связано с тем, что у тебя WinMain __cdecl, а должно быть __stdcall, исправляется добавлением
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)

надо еще проверить, что у тебя с UNICODE'ностью проблем нет.
Попробуй заменить сигнатуру на
Код: plaintext
1.
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как корректно завершить программу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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