0

你现在可以试试这个。

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

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

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

链接刚刚制作的静态库。

然后你的程序从 WinMain 开始。

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

仅当您在静态库中定义 WinMain 时才会发生这种情况。

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

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

为什么会这样?

4

1 回答 1

0

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

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

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

我建议您使用 _tWinMain 定义一个入口点:

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

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

于 2011-04-18T19:06:58.753 回答