当_UNICODE定义时,为什么__tmainCRTStartup调用WinMain?

时间:2011-04-18 15:16:19

标签: winapi static-libraries entry-point winmain

你现在可以试试。

定义WinMain和wWinMain abd将其编译为静态库。

为可执行文件exe创建一个新项目。

设置字符集设置UNICODE系统。(定义_UNICODE)

链接刚刚创建的静态库。

然后你的程序从WinMain开始。

当定义WinMain和wWinMain时,无论字符集是多字节还是unicode,都会调用WinMain。

只有在静态库中定义WinMain时才会发生。

在源项目中定义WinMain和wWinMain时,它可以正常工作,

unicode系统调用wWinMain和多字节系统调用WinMain。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

链接器尝试推断出您的入口点,并替换__tmainCRTStartup的correspoinding实现。但是这里有两个限制:

  • 链接器不是为了在两个或更多入口点之间进行猜测而设计的。事实上,当链接器找到多个选项时,链接器会生成警告LNK4067: ambiguous entry point
  • 链接器不了解预处理器,因此您定义的任何预处理器符号在链接器运行时都是无关紧要的。

所以,为了回答你的问题,为什么你会看到这个,你是否正在遇到“未定义行为”的案例之一。您不应该依赖此行为,因为它不能保证可以工作,并且可能会在新的编译器版本中更改。

我建议你使用_tWinMain定义一个单一的入口点:

int APIENTRY _tWinMain(HINSTANCE hInstance,   
                 HINSTANCE hPrevInstance,   
                 LPTSTR    lpCmdLine,   
                 int       nCmdShow)   

链接器还有/ ENTRY选项,但我不建议您使用它,因为它更危险,您可以通过简单地定义单个入口函数并为/ SUBSYSTEM链接器选项传递正确的值来实现相同的功能。