【问题标题】:#define _UNICODE not working with MinGW + CodeBlocks#define _UNICODE 不适用于 MinGW + CodeBlocks
【发布时间】:2011-01-11 18:37:37
【问题描述】:

通常我使用 Visual Studio,但我切换到了 mingw,我喜欢让我的应用程序可以轻松地从 unicode 和多字节更改,在我的 mingw 项目中我有我的定义并包含如下:

#define WIN32_LEAN_AND_MEAN
#define WINVER 0x0700
#define _UNICODE

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>

#define WND_MAIN_CLASS  _T("MainWindowFrame")

然后我注册并创建我的窗口,例如

 WNDCLASSEX wc;
...
wc.lpszClassName = WND_MAIN_CLASS;

RegisterClassEx(&wc);

    hwnd = CreateWindowEx(0, WND_MAIN_CLASS, _T("Main Window"),
  WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInst, NULL);

但是当我去编译时,我得到错误,它无法将 WNDCLASSEX lpszClassName 上的 wchar_t 转换为 CHAR* 以及类名和窗口标题上的 CreateWindowEx。

如果我右键单击并转到 createwindowex 和 WNDCLASSEX 的声明,它会从 winuser.h 中找到这些:

    typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;

#define CreateWindowEx CreateWindowExW

如果我注释掉定义 _UNICODE,它会编译并正常工作

【问题讨论】:

  • 那个WINVER是怎么回事?我不知道有 Windows 版本 7。
  • 大声笑,我认为这意味着 Windows 7,哦,好吧.. 至少现在应该包含所有内容,它是如此之高...... Windows 7 的 WINVER 是什么?我认为 vista 是 0x0600 和 xp 0x0500
  • @user394242: 2000 是 5.0, XP=5.1, 2003=5.2, Vista=6.0 和 7=6.1(2008 与 VistaSP1: 6.0.6001 相同,而 VistaRTM 的内部版本号是 6000,这是服务包第一次更改操作系统版本 AFAIK)
  • 如果你想在 MinGW 中使用 Unicode,你需要一个包装器或-municode 选项。详情请见:stackoverflow.com/questions/3571250/wwinmain-unicode-and-mingw/…

标签: winapi unicode mingw codeblocks


【解决方案1】:

在编译 unicode 应用程序时,您可能应该同时定义 UNICODE_UNICODE。 Windows 标头使用UNICODE,MS C 运行时使用_UNICODE

【讨论】:

  • 如果您想在 ANSI 和 Unicode 之间轻松切换,请在构建选项中指定它们,而不是在源代码中定义它们。
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多