У меня есть эта простая программа:
#include <windows.h>
int WINAPI startMeUp() {
return 0;
}
, который я компилирую с помощью инструментов командной строки Visual Studio следующим образом:
cl /nologo /GS- /Gs- /c /W4 main.c /Fomain.obj
link /nologo main.obj /subsystem:console /entry:startMeUp /nodefaultlib kernel32.lib user32.lib /OUT:the.exe
Когда я затем выполняю .\the.exe
, появляется сообщение о том, что the.exe перестала работать - из-за проблемы программа перестала работать правильно. Windows закроет программу и сообщит вам, если решение доступно
После замены return 0;
на ExitProcess(0);
и повторной компиляции / компоновки .\the.exe
работает нормально.
Итак, мне кажется, что ExitProcess()
необходим для правильного завершения процесса.
Поскольку я почти уверен, что у меня уже были рабочие программы, которые возвращали функцию точки входа, возвращая значение выхода, я не уверен, что для переносимых исполняемых файлов требуется, чтобы процесс завершался ExitProcess()
.
Редактировать
Интересно, что если я поставлю MessageBox(NULL, "world", "hello", 0);
перед return 0;
(и, следовательно, не вызову ExitProcess()
), исполняемый файл также будет работать нормально.
Редактировать II
Когда я добавляю параметр компоновщика /export:startMeUp
, компоновщик предупреждает меня с помощью LNK4216
, но я могу выполнить созданное без проблем.
Когда я использую dumpbin /all
в обоих созданных exe-файлах, я вижу, что неисправный исполняемый файл имеет
0 [ 0] RVA [size] of Export Directory
в то время как новый, рабочий имеет
2000 [ 40] RVA [size] of Export Directory
Кроме того, рабочий исполняемый файл состоит из двух разделов: .text
и .rdata
, в то время как неисправный имеет только раздел .text
. Кажется, исполняемый код включен в раздел .rdata
, поэтому он отсутствует в неисправном.
Что касается почему , то есть я понятия не имею.