2016-08-08 2 views
0

Итак, проходя через источник программы winapi, которую я нашел в Интернете, я заметил, что WinMain не было нигде, мне интересно, возможно ли вообще сделать так, чтобы программа winapi работала так, почему вы думаете, оригинальный программист сделал что-то вроде этого, у нас есть процедура диалога, как это:точка входа winapi без WinMain

static INT_PTR CALLBACK mainDialogProc(HWND hwnd, UINT msg, WPARAM wParam, 
    LPARAM lParam) 
{ 
switch(msg) 
    { 
    case WM_INITDIALOG: 
    { 
    //.............. 
    } 
    } 
} 

и главный EntryPoint был, как это вместо пустоты WINAPI WinMain (ничтожной);

void WINAPI entryPoint(void) 
{ 
//........ 
} 

Действительно ли это возможно? это противоречит всем, что я изучил до сих пор ... Я действительно уверен, что мне что-то не хватает ...

+1

WinMain - это только соглашение, вы не имеете * его использовать. Параметр linker/ENTRY может сделать любую функцию без параметра - точкой входа в программу. Что довольно неразумно, вы обойдете инициализацию библиотеки времени выполнения C. Не то чтобы вы когда-либо использовали много, но вы также обойдете любую инициализацию своих собственных статических объектов. Возможно, это был проект с наименьшей возможной программой, использование шаблона диалога является типичной частью такого взлома. Не делай этого. –

+1

@HansPassant Кроме того, есть части среды выполнения C, которые используются неявно, например, защита переполнения буфера GS и 'atexit'. Поэтому, даже если вы не думаете, что используете время выполнения C, вы можете быть. –

ответ

0

Вы можете использовать опцию компоновщика /ENTRY:"entryPoint" для установки произвольной точки входа.

+1

Это ответ, только если вы уже знаете ответ и, следовательно, можете расшифровать текст –

+0

Таким образом вы отбросите все инициализации CLIB и статических объектов, а также удалите по умолчанию исключение по умолчанию для исключения исключений статического объекта в WinMainCRTStartup, default/ENTRY: вызов WinMain. –

+0

@EmilioGaravaglia - мы можем, например, вообще не использовать CRT, или вызывать запись CRT по умолчанию из entryPoint – RbMm

0

В основном это зависит от компилятора, но «точкой входа» исполняемого файла является функция, объявленная в компоновщике с помощью соответствующих параметров. WinMainCRTStarup - это только по умолчанию, что после инициализации библиотеки по умолчанию - WinMain.

В любом случае, код, написанный таким образом, вероятно, определен как автономный, с идеей, что вы назовете enrypoint от своего собственного WinMain, где вы также можете сделать что-нибудь еще.

+0

'WinMain' никогда не устанавливается как точка входа по умолчанию. 'WinMainCRTStartup' - обычный набор по умолчанию.'WinMain' вызывается из' WinMainCRTStartup' – RbMm

+0

@RbMin: Да, существует некоторая инициализация/завершение, которое происходит раньше: WinMainCRTStartup вызывает вызовы WinMain и mainCRTStartup main. Дело в том, что он может заменить их «точкой входа» (но не имеет кода запуска) или - намного лучше - вызовите «entripoint» из WinMain, не изменяя нормальную стандартную последовательность инициализации. –

6

Точка входа для исполняемого изображения определяется с помощью установки компоновщика /ENTRY. Если он явно не установлен, по умолчанию используется mainCRTStartup (или wmainCRTStartup) для консольного приложения, WinMainCRTStartup (или wWinMainCRTStartup) для приложения GUI и _DllMainCRTStartup для библиотеки DLL. При использовании ЭЛТ, который поставляется как часть Visual Studio, все вышеперечисленные исходные точки входа вызывают в введенные пользователем точки входа main (или wmain), WinMain (или wWinMain) и DllMain, соответственно. Это реализовано в crt0.c, который поставляется как часть исходного кода Visual Studio CRT.

Если вы предоставите свою точку входа (с помощью опции /ENTRY компоновщика), он должен иметь следующую подпись (для 32-разрядных приложений): чтение

DWORD CALLBACK RawEntryPoint(void); 


Bonus: WinMain is just the conventional name for the Win32 process entry point

+0

отличный вход @Inpectable, этот сарай Огромный свет! – IngMike

+0

@IngMike: Stackoverflow - это не форум. Вместо размещения комментариев * «Спасибо!» *, вы должны проголосовать за ответы и принять их, чтобы помочь будущим посетителям быстро перейти к соответствующей информации. Я делаю, когда кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers). – IInspectable

Смежные вопросы