WinMain可以编译,但wWinMain在CodeBlocks中无法编译。

3

我正在尝试使用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中编译时,只会得到以下消息:“undefined reference to WinMain@16”。 显然,CodeBlocks希望是不接收LPWSTR值作为参数的WinMain版本。 我的问题是,如何配置CodeBlocks以便使用wWinMain进行编译?

这是一个链接器错误,而不是编译器错误。你应该链接到包含所需函数的库。 - PaulMcKenzie
1个回答

5
wWinMain 是与编译器相关的特定于 Visual Studio 的函数。Code::Blocks 通常是使用 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。它是免费的!


3
"GetCommandLineW()包括可执行文件的路径和参数。" - 不,它返回由调用CreateProcess的进程设置的命令行。将模块名称重复作为第一个参数是一种常见的约定,但没有必要这样做,也没有任何强制执行这样做的内容。"注意,如果可以的话,应该使用Visual Studio。它是免费的!"- 更重要的是,默认情况下VS使用Unicode项目设置(不像Code::Blocks)。 - IInspectable
@IInspectable 谢谢,我编辑了问题,试图修复那个评论。 - Barmak Shemirani
GCC是一个非常好的编译器,可惜Windows工具太差了。我的意思是,缺乏全面的Unicode支持真是荒谬。有人应该着手改进MinGW...一个干净的MSVC运行时库端口似乎并不难,只是需要花费相当多的时间。 - Cody Gray
@CodyGray:移植CRT确实很困难。我甚至不知道从哪里开始实现异常处理。而且还要以一种与微软实现不同的方式来完成,以避免法律问题的出现。 - IInspectable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接