【问题标题】:Why __tmainCRTStartup call WinMain when _UNICODE defined?为什么 _UNICODE 定义时 __tmainCRTStartup 调用 WinMain?
【发布时间】:2011-04-18 15:16:18
【问题描述】:

你现在可以试试这个。

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

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

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

链接刚刚制作的静态库。

那么你的程序从 WinMain 开始。

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

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

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

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

为什么会这样?

【问题讨论】:

  • 你真正想要达到什么目的?您是否正在寻找关于给您的主要功能起什么名字的建议?

标签: winapi static-libraries entry-point winmain


【解决方案1】:

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

  • 链接器并非设计用于在两个或多个入口点之间进行猜测。事实上,链接器在发现多个选项时会产生警告LNK4067: ambiguous entry point
  • 链接器不了解预处理器,因此您定义的任何预处理器符号在链接器运行时都无关紧要。

所以,要回答您为什么看到这个问题,您是否遇到了“未定义行为”的情况之一。您不应依赖此行为,因为不能保证它可以正常工作,并且可能会在新的编译器版本中发生变化。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多