2

所以我正在尝试使用 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 一起编译?

4

1 回答 1

4

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]
}

lpCmdLine但是和之间有区别GetCommandLineW。查看文档

赢主

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

获取命令行

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

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

于 2016-07-17T09:10:08.120 回答