C++ 错误:无法在赋值中将“const wchar_t [13]”转换为“LPCSTR {aka const char*}”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13977388/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 17:51:56  来源:igfitidea点击:

error: cannot convert 'const wchar_t [13]' to 'LPCSTR {aka const char*}' in assignment

c++winapicompiler-errors

提问by Gladstone Asder

// include the basic windows header file
#include <windows.h>
#include <windowsx.h>

// the WindowProc function prototype LRESULT CALLBACK WindowProc(HWND hWnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam);

// the entry point for any Windows program int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow) {
    // the handle for the window, filled by a function
    HWND hWnd;
    // this struct holds information for the window class
    WNDCLASSEX wc;

    // clear out the window class for use
    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    // fill in the struct with the needed information
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass1";

    // register the window class
    RegisterClassEx(&wc);

    // create the window and use the result as the handle
    hWnd = CreateWindowEx(NULL,
                          L"WindowClass1",    // name of the window class
                          L"Our First Windowed Program",   // title of the window
                          WS_OVERLAPPEDWINDOW,    // window style
                          300,    // x-position of the window
                          300,    // y-position of the window
                          500,    // width of the window
                          400,    // height of the window
                          NULL,    // we have no parent window, NULL
                          NULL,    // we aren't using menus, NULL
                          hInstance,    // application handle
                          NULL);    // used with multiple windows, NULL

    // display the window on the screen
    ShowWindow(hWnd, nCmdShow);

    // enter the main loop:

    // this struct holds Windows event messages
    MSG msg;

    // wait for the next message in the queue, store the result in 'msg'
    while(GetMessage(&msg, NULL, 0, 0))
    {
        // translate keystroke messages into the right format
        TranslateMessage(&msg);

        // send the message to the WindowProc function
        DispatchMessage(&msg);
    }

    // return this part of the WM_QUIT message to Windows
    return msg.wParam; }

// this is the main message handler for the program LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // sort through and find what code to run for the message given
    switch(message)
    {
        // this message is read when the window is closed
        case WM_DESTROY:
            {
                // close the application entirely
                PostQuitMessage(0);
                return 0;
            } break;
    }

    // Handle any messages the switch statement didn't
    return DefWindowProc (hWnd, message, wParam, lParam); }

=============== I use CodeBlock, this code is from a Direct X tutorial.

============== 我使用 CodeBlock,此代码来自 Direct X 教程。

I get the following errors:

我收到以下错误:

||In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':|
error: cannot convert 'const wchar_t [13]' to 'LPCSTR {aka const char*}' in assignment|
|49|warning: converting to non-pointer type 'DWORD {aka long unsigned int}' from NULL [-Wconversion-null]|
|49|error: cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'|
||=== Build finished: 2 errors, 1 warnings ===|

回答by Praetorian

Your project doesn't have the UNICODEpreprocessor symbol defined, so Windows API functions that take pointers to strings expect char *and not wchar_t *. Change

您的项目没有UNICODE定义预处理器符号,因此 Windows API 函数采用指向字符串的指针 expectchar *而不是wchar_t *. 改变

L"WindowClass1"

to

"WindowClass1"

Do the same for the remaining string literals. Alternatively, change them to _T("WindowClass1"), this will expand to the correct type of string literal based on the UNICODEsymbol being defined.

对剩余的字符串文字执行相同的操作。或者,将它们更改为_T("WindowClass1"),这将根据UNICODE定义的符号扩展为正确类型的字符串文字。



My recommendation is to go to your project properties and change the Character Setsetting to Unicode, and then use the wide char versions of all Windows API functions explicitly. For example, instead of CreateWindow, call CreateWindowW.

我的建议是转到您的项目属性并将Character Set设置更改为Unicode,然后显式使用所有 Windows API 函数的宽字符版本。例如,代替CreateWindow,调用CreateWindowW

EDIT:
The project setting I suggested only applies to Visual Studio, not sure how to do that in Code::Blocks.

编辑:
我建议的项目设置仅适用于 Visual Studio,不确定如何在 Code::Blocks 中执行此操作。

回答by user93353

1) If you want to compile with UNICODE, then change the options. If you are compiling from IDE, the set the following propery Configuration Properties -> General -> Project Defaults -> Character Set -> Use Unicode Character Set.

1) 如果要使用 UNICODE 编译,则更改选项。如果您是从 IDE 编译,请设置以下属性 Configuration Properties -> General -> Project Defaults -> Character Set -> Use Unicode Character Set。

If compiling from command line use options /DUNICODE /D_UNICODE

如果从命令行编译使用选项 /DUNICODE /D_UNICODE

If you don't want to compile with UNICODE, just follow steps 2 & 3 below. In Char Set, do not chose UNICODE.

如果您不想使用 UNICODE 进行编译,只需按照下面的第 2 步和第 3 步操作即可。在 Char Set 中,不要选择 UNICODE。

2) Before

2) 之前

#include <windows.h>

add

添加

#include <tchar.h>

3) Change

3) 改变

wc.lpszClassName = L"WindowClass1";

to

wc.lpszClassName = _T("WindowClass1");

If you want to compile with UNICODE, you could get by just by doing #1, but best to do all 3.

如果你想用 UNICODE 编译,你可以只做 #1,但最好做所有 3。

If you want to compile without UNICODE, do #2 & #3 - don't do #1.

如果您想在没有 UNICODE 的情况下进行编译,请执行 #2 & #3 - 不要执行 #1。

回答by Rian Prakoso

I use this on my single source code file because I don't want to change my current project configuration

我在我的单个源代码文件中使用它,因为我不想更改我当前的项目配置

#ifndef UNICODE
#define UNICODE
#define UNICODE_WAS_UNDEFINED
#endif

#include <Windows.h>

#ifdef UNICODE_WAS_UNDEFINED
#undef UNICODE
#endif