尝试打开W​​in32窗口时变量不兼容

时间:2018-09-16 21:00:12

标签: c++ winapi

我关注手工制作的英雄系列,尝试编译时遇到一些错误,我正在运行Visual Studio 2017 这是错误的屏幕截图:

bugs

这是发生问题的代码:

int CALLBACK
WinMain(HINSTANCE Instance,
HINSTANCE PrevInstance,
LPSTR CommandLine,
int ShowCode)
{
WNDCLASS WindowClass = {};

// TODO(casey): Check if HREDRAW/VREDRAW/OWNDC still matter
WindowClass.lpfnWndProc = Win32MainWindowCallback;
WindowClass.hInstance = Instance;
//    WindowClass.hIcon;
WindowClass.lpszClassName = "HandmadeHeroWindowClass";

if (RegisterClassA(&WindowClass))
{
    HWND WindowHandle =
        CreateWindowExA(
            0,
            WindowClass.lpszClassName,
            "Handmade Hero",
            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            0,
            0,
            Instance,
            0);

编译错误:

  • “ const char *”不能分配给“ LPCWSTR”类型的实体
  • “ WNDCLASS *”与类型“ const WNDCLASSA *”的参数不兼容
  • “ LPCWSTR”与“ LPCSTR”类型的参数不兼容

1 个答案:

答案 0 :(得分:0)

此问题是由不兼容类型的混合引起的。虽然代码确保调用RegisterClassA(API的ANSI版本),但它无法提供匹配的WNDCLASS结构。这是在使用显式ANSI或Unicode调用的上下文中混合了用于通用文本映射的类型。

最简单的解决方法是将WNDCLASS替换为WNDCLASSA。更好的方法是了解ANSI,Unicode,以及为什么最好在整个代码中使用Windows API中的Unicode版本(Windows中的Unicode等同于UTF-16LE编码)。

首先阅读Conventions for Function Prototypes