6

WinMain 是一个“替换”默认主入口点“main”的函数。

然后,用户可以定义其主要入口点,例如

int WINAPI WinMain(...) { }


这种封装是如何完成的?

好吧,最有可能的是,在某些时候它看起来像这样:

int main() // This must be defined somewhere in windows.h
{
    return WinMain(...);
}

问题:我怎样才能完成我自己的这样一个封装,然后调用 WinMain?注意:我制作的库是一个 DLL,所以它看起来像这样:

// This is the minimal code for the application which uses 'MyLibrary'
#pragma comment(lib, "MyLibrary.lib")
include "MyLibrary.h"

void Main(MyCustomParameter *params)
{
    // Write user code here
}

然而问题是,DLL 不“知道”该Main()函数,因此会引发“未解析的外部符号”编译错误。那么我怎样才能像这样封装它呢?

4

3 回答 3

4

您必须确定自定义主函数的签名并将其声明为“extern”(在 C++ 的情况下为外部“C”)。然后,应用程序代码必须定义该函数并链接到具有实际_main入口点的静态库。例如:

extern "C" int my_main(int argc, char *argv[]);

int main(int argc, char *argv[])
{
    return my_main(argc, argv);
}
于 2013-03-28T19:13:03.457 回答
3

实际上,真正的入口点既不是 main 也不是 WinMain。真正的入口点是 wWinMainCRTStartup、WinMainCRTStartup、wmainCRTStartup 和 mainCRTStartup 之一。但它们没有在 Windows.h 中定义,它们是 CRT 的一部分。<VS installation folder>你可以在\VC\crt\src\crtexe.c中看到他们的代码。它们各自进行一些初始化,然后分别调用 wWinMain、WinMain、wmain 和 main 之一。

正如其他人所提到的,您可以使用 /ENTRY 开关覆盖入口点,但您仍然不能拥有自定义参数,这就是您首先要执行此操作的全部原因。

于 2013-03-28T20:06:06.127 回答
2

链接器默认入口点名称是“main”。您可以覆盖默认值以使用您想要的任何功能开始。

/ENTRY(入口点符号)

于 2013-03-28T19:12:12.467 回答