【问题标题】:WinMain compiles, but wWinMain does not in CodeBlocks [duplicate]WinMain 编译,但 wWinMain 不在 CodeBlocks [重复]
【发布时间】:2016-11-19 23:12:47
【问题描述】:

所以我尝试使用 Win32 在 CodeBlocks 中创建一个窗口,到目前为止只有这个版本的 WinMain 有效(注意:这只是一个简单而幼稚的示例):

#include <windows.h>

INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow ) {
    MessageBox( NULL, "Title", "Message", MB_OKCANCEL );
    return 0;
}

但是这个版本没有:

#include <windows.h>

INT WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nCmdShow ) {
    MessageBox( NULL, "Title", "Message", MB_OKCANCEL );
    return 0;
}

据我所知,后者期望第三个参数是指向宽字符字符串的指针,而前者则不然。但是当我在 CodeBlocks 中编译时,我得到的只是这条消息:

对 WinMain@16 的未定义引用

显然 CodeBlocks 期望 WinMain 版本不接收 LPWSTR 值作为参数。 我的问题是,如何配置 CodeBlocks 以使其与 wWinMain 一起编译?

【问题讨论】:

  • 这是一个链接器错误,而不是编译器错误。您应该链接到包含相关函数的库。

标签: c++ winapi codeblocks winmain


【解决方案1】:

wWinMain 是特定于编译器的。它受 Visual Studio 支持。 Code::Block 通常是用 MinGW 设置的,它会编译 wWinMain 但它给出了链接错误,因为它没有将 wWinMain 识别为入口点,它仍在寻找 WinMain 入口点。

您可以只使用WinMain 的第一个版本,然后将GetCommandLineW() 用于Unicode 命令行。示例:

int argc;
wchar_t** argv = CommandLineToArgvW( GetCommandLineW(), &argc );
for (int i = 0; i < argc; i++)
{
    //output argv[i]
}

但是lpCmdLineGetCommandLineW 之间存在差异。查看文档

WinMain:

lpCmdLine:应用程序的命令行,不包括程序名

GetCommandLine:

GetCommandLineW(): 当前进程的命令行字符串

注意,如果可以,您应该使用 Visual Studio。免费!

【讨论】:

  • "GetCommandLineW() 包括可执行文件的路径以及参数。" - 不,它返回调用CreateProcess 的进程设置的命令行。将重复模块名称作为第一个参数传递是一个常见的约定,但没有要求这样做,当然也没有什么可以强制执行的。 “注意,如果可以的话,你应该使用 Visual Studio。它是免费的!” - 可以说更重要的是,VS 默认使用 Unicode 项目设置(与 Code::Blocks 不同)。
  • @IInspectable 谢谢,我编辑了这个问题,试图修正那个评论。
  • GCC 是一个非常好的编译器,可惜 Windows 工具如此可悲。我的意思是说,缺乏全面的 Unicode 支持是荒谬的。真的应该有人努力改进 MinGW.... MSVC 运行时库的洁净室端口似乎并不困难,只是相当耗时。
  • @CodyGray:移植 CRT 很困难。我什至不知道从哪里开始实施异常处理。并以与 MS 的实施方式截然不同的方式进行,以避免法律问题。
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多