没有WinMain的winapi入口点

winapi entry point without WinMain

本文关键字:入口 winapi WinMain 没有      更新时间:2023-10-16

所以通过一个winapi程序的源代码,我发现在任何地方都没有WinMain,我想知道是否有可能让winapi程序像这样工作,为什么你认为原始程序员做了这样的事情,我们有这样的对话过程:

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

和主入口点是这样的,而不是void WINAPI WinMain (void);

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

这真的可能吗?它违背了我迄今为止所学的一切……

可执行映像的入口点是通过链接器设置/entry指定的。如果没有显式设置,则默认为控制台应用程序的mainCRTStartup(或wmainCRTStartup), GUI应用程序的WinMainCRTStartup(或wWinMainCRTStartup)和DLL的_DllMainCRTStartup。当使用Visual Studio自带的CRT时,前面提到的所有原始入口点分别调用用户提供的入口点main(或wmain)、WinMain(或wWinMain)和DllMain。这是在crt0.c中实现的,它是Visual Studio的CRT源代码的一部分。

如果您提供自己的入口点(通过指定/ENTRY链接器选项),它必须具有以下签名(对于32位应用程序):

DWORD CALLBACK RawEntryPoint(void);

附加说明:WinMain只是Win32进程入口点的常规名称

它主要依赖于编译器,但可执行文件的"入口点"是在链接器中通过适当的选项声明的函数。WinMainCRTStarup只是默认的,在初始化默认库之后,它调用WinMain

无论如何,像这样编写的代码可能被定义为自包含的,其想法是您将从自己的WinMain调用enrypoint,在那里您还可以做任何其他事情。

您可以使用/ENTRY:"entryPoint"链接器选项来设置任意入口点