C++ 正在尝试用c++;,分配字符串时出错,LPCSTR/LPCWSTR

C++ 正在尝试用c++;,分配字符串时出错,LPCSTR/LPCWSTR,c++,windows,lpcstr,C++,Windows,Lpcstr,我在谷歌上搜索了几个小时,似乎什么都没用。 我不会把我的东西分成.h和.cpp,因为奇怪的东西是出于某种原因发生的,但这不是重点 我收到以下错误: 无法在分配gcc[59,24]中将“const wchar_t[16]”转换为“LPCSTR”{aka“const char*”} 无法在分配gcc[60,23]中将“const wchar_t[1]”转换为“LPCSTR”{aka“const char*”} “const char”类型的参数与“LPCWSTR”类型的参数不兼容[68,54] 无法

我在谷歌上搜索了几个小时,似乎什么都没用。 我不会把我的东西分成.h和.cpp,因为奇怪的东西是出于某种原因发生的,但这不是重点

我收到以下错误:
无法在分配gcc[59,24]中将“const wchar_t[16]”转换为“LPCSTR”{aka“const char*”} 无法在分配gcc[60,23]中将“const wchar_t[1]”转换为“LPCSTR”{aka“const char*”} “const char”类型的参数与“LPCWSTR”类型的参数不兼容[68,54] 无法将'const wchar_t'转换为'LPCSTR'{aka'const char*'}gcc[68,72]

#ifndef WINDOW_INCLUDED
#define WINDOW_INCLUDED

#define _UNICODE
#include <Windows.h>

class Window{
    public:
    Window();
    //intitialize window
    bool init();
    bool broadcast();
    //release window
    bool release();
    bool isRunning();
    //virtual events
    virtual void onCreate();
    virtual void onUpdate();
    virtual void onDestroy();
    ~Window();
    protected:
    HWND m_hwnd;
    bool m_is_running;
};

//i'm not splitting this into an h and cpp file lol

Window* window = nullptr;

Window::Window(){

}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){
    switch(msg){
        case WM_CREATE:{
            window->onCreate();
            break;
        }
        case WM_DESTROY:{
            window->onDestroy();
            ::PostQuitMessage(0);
            break;
        }
        default:
            return ::DefWindowProc(hwnd,msg,wparam,lparam);
    }
    return NULL;
}
bool Window::init(){
    WNDCLASSEX wc;
    wc.cbClsExtra = NULL;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.cbWndExtra = NULL;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = NULL;
    wc.lpszClassName = L"GameWindowClass"; //ERROR HERE
    wc.lpszMenuName = L""; //ERROR HERE
    wc.style = NULL;
    wc.lpfnWndProc = &WndProc;
    if(!::RegisterClassEx(&wc))
        return false; //abort if registration fails
    //get window pointer
    if(!window)
        window = this;
    m_hwnd = ::CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,"GameWindowClass"/*ERROR HERE*/,L"kool gaem lul",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,1024,768,NULL,NULL,NULL,NULL);
    if(!m_hwnd)
        return false; //abort if window creation fails
    //show window
    ::ShowWindow(m_hwnd,SW_SHOW);
    ::UpdateWindow(m_hwnd);
    m_is_running = true;//we did it bois, window exists!
    return true; //all green, mission complete!
}
bool Window::broadcast(){
    MSG msg;
    while (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)>0){//user-kun is giving us input, lets process it!
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    window->onUpdate();//update stuff
    Sleep(0); //give the computer a rest, hes a hard working boi.
    return true;
}
bool Window::release(){
    if(!::DestroyWindow(m_hwnd)) //destroy window
        return false; //abort case window is not destroyed
    return true;
}
bool Window::isRunning(){
    return m_is_running;
}
void Window::onDestroy(){
    m_is_running = false;//window is kill. no.
}
Window::~Window(){

}

#endif
似乎解决了

我仍然不确定这到底是为什么,但是将一些api函数更改为“W版本”修复了它 我已经试过了,但我想在这一过程中,其他一些东西也一定被修复了


感谢您的帮助,rustyx。

删除
#定义
或与向WinAPI函数传递UNICODE字符串保持一致(
L“xxx”
无处不在,
WNDCLASSEXW
等)
\define\u UNICODE
意味着您进行的许多Windows调用实际上将调用使用宽字符的函数的
FunctionNameW
版本。我的建议是你在整个过程中使用宽字符。只使用
wchar\u t
,并且(大部分情况下)忘记
char
的存在。如果启用了UNICODE,您将希望使用宽字符串,因此
“GameWindowClass”
变得与
L“GameWindowClass”
相关:我尝试在传入的每个字符串的开头添加L,错误持续存在您是否将WNDCLASSEX更改为WNDCLASSEXW?@jer是
UNICODE
预处理器符号控制Windows API中的API版本<代码>\u UNICODE
控制CRT。虽然没有明确说明API变量的严格要求,但明确说明肯定会有所帮助。它不仅为编译器而且为人类读者消除了代码的歧义。
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\main_win32.exe",
                "-I",
                "${fileDirname}\\libraries",
                "-I",
                "${fileDirname}\\classes",
                "-I",
                "${fileDirname}\\lib_w32"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}