不能将'LPCWSTR {aka const wchar_t*}转换为'LPCSTR {aka const char*}

时间:2022-12-04 05:52:50

I have been trying to get Glew and opengl 3.2 working with code blocks(minGW) in a win32 context. i found a nice little tutorial here

我一直试图让Glew和opengl 3.2在win32上下文中使用代码块(minGW)。我在这里找到了一个很好的教程

As i had been trying to work out if compiling glew in codeblocks was actually possible i wanted to try the source out before doing the tutorial to see if it would work.

因为我一直在试图弄清楚在代码库中编译glew是否真的可行,所以我想在编写教程之前先尝试一下源代码,看看它是否有效。

after tweaking the code slightly I tried to compile and got several errors that i have never seen before. they are as follows

在稍微调整了代码之后,我尝试编译并得到了一些我以前从未见过的错误。他们如下

|In function 'bool createWindow(LPCWSTR, int, int)':|
|73|error: cannot convert 'LPCWSTR {aka const wchar_t*}' to 'LPCSTR {aka const char*}' in assignment|
|80|error: cannot convert 'LPCWSTR {aka 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)'|
|In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':|
|105|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
|110|error: '_TRUNCATE' was not declared in this scope|
|110|error: 'mbstowcs_s' was not declared in this scope|

My code is

我的代码是

include <iostream>
#include <Windows.h>

#ifndef GLEW_STATIC
#define GLEW_STATIC
#endif //GLEW_STATIC



#include <GL/glew.h>
#include <GL/wglew.h>

//using namespace std;
//
//int main()
//{
//    cout << "Hello world!" << endl;
//    return 0;
//}


#include "opengl_3.h"

OpenGLContext openglContext; // Our OpenGL Context class

bool running = true; // Whether or not the application is currently running

HINSTANCE hInstance; // The HINSTANCE of this application
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Standard window callback

/**
    WndProc is a standard method used in Win32 programming for handling Window messages. Here we
    handle our window resizing and tell our OpenGLContext the new window size.
*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_SIZE: // If our window is resizing
        {
            openglContext.reshapeWindow(LOWORD(lParam), HIWORD(lParam)); // Send the new window size to our OpenGLContext
            break;
        }

        case WM_DESTROY:
        {
            PostQuitMessage(0);
            break;
        }
    }

    return DefWindowProc(hWnd, message, wParam, lParam);
}

/**
    createWindow is going to create our window using Windows API calls. It is then going to
    create our OpenGL context on the window and then show our window, making it visible.
*/
bool createWindow(LPCWSTR title, int width, int height) {
    WNDCLASS windowClass;
    HWND hWnd;
    DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;

    hInstance = GetModuleHandle(NULL);

    windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    windowClass.lpfnWndProc = (WNDPROC) WndProc;
    windowClass.cbClsExtra = 0;
    windowClass.cbWndExtra = 0;
    windowClass.hInstance = hInstance;
    windowClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowClass.hbrBackground = NULL;
    windowClass.lpszMenuName = NULL;
    windowClass.lpszClassName = title;

    if (!RegisterClass(&windowClass)) {
        return false;
    }

    hWnd = CreateWindowEx(dwExStyle, title, title, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, width, height, NULL, NULL, hInstance, NULL);

    openglContext.create30Context(hWnd); // Create our OpenGL context on the given window we just created

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    return true;
}

/**
    WinMain is the main entry point for Windows based applications as opposed to 'main' for console
    applications. Here we will make the calls to create our window, setup our scene and then
    perform our 'infinite' loop which processes messages and renders.
*/
int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR    lpCmdLine,
                     int       nCmdShow) {
    MSG msg;

    /**
        The following 6 lines of code do conversion between char arrays and LPCWSTR variables
        which are used in the Windows API.
    */
    char *orig = "OpenGL 3 Project"; // Our windows title
    size_t origsize = strlen(orig) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);

    createWindow(wcstring, 500, 500); // Create our OpenGL window

    openglContext.setupScene(); // Setup our OpenGL scene

    /**
        This is our main loop, it continues for as long as running is true
    */
    while (running)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // If we have a message to process, process it
            if (msg.message == WM_QUIT) {
                running = false; // Set running to false if we have a message to quit
            }
            else {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else { // If we don't have a message to process
            openglContext.renderScene(); // Render our scene (which also handles swapping of buffers)
        }
    }

    return (int) msg.wParam;
}

(Sorry about the wall of text) there are also other files but all the errors seem to becoming from here. ill post the rest if needed.

(对不起,是文本墙)还有其他文件,但是所有的错误似乎都是从这里开始的。如果需要的话,我将把剩下的寄出去。

I haven't really seen any errors similar to this so i did some googling and found out that the error was caused by the compiler not being set to multi byte(a setting in VS2010). i did some looking around and couldnt find any such settings in codeblocks. is this code only usable in VS or have I missed something? im worried it might be something to do with my linking due to me having a lot of issues with this in the past. any help would be appreciated.

我还没有看到类似的错误,所以我搜索了一下,发现错误是由于编译器没有设置为多字节(VS2010中的设置)造成的。我四处查看了一下,在代码库中找不到任何这样的设置。这段代码只能在VS中使用,还是我漏掉了什么?我担心这可能与我的链接有关,因为我过去有很多问题。如有任何帮助,我们将不胜感激。

2 个解决方案

#1


8  

Change CreateWindowEx to CreateWindowExW or define the macro UNICODE before including any headers.

将CreateWindowEx更改为CreateWindowExW或在包含任何头部之前定义宏UNICODE。

#2


2  

I've never used minGW, so take this with a huge grain of salt. (VS Express is free to use, BTW.)

我从来没有使用过明华,所以用一粒盐就可以了。(顺便说一句,VS Express是免费使用的。)

The Unicode/Ascii decision is largely controlled by the UNICODE define. So if you #define UNICODE 1, or possibly pass that in on your compile commandline, there's a good chance that would solve your problem.

Unicode/Ascii决定主要由Unicode定义控制。因此,如果您#定义UNICODE 1,或者可能在编译命令行中传递它,那么很有可能解决您的问题。

#1


8  

Change CreateWindowEx to CreateWindowExW or define the macro UNICODE before including any headers.

将CreateWindowEx更改为CreateWindowExW或在包含任何头部之前定义宏UNICODE。

#2


2  

I've never used minGW, so take this with a huge grain of salt. (VS Express is free to use, BTW.)

我从来没有使用过明华,所以用一粒盐就可以了。(顺便说一句,VS Express是免费使用的。)

The Unicode/Ascii decision is largely controlled by the UNICODE define. So if you #define UNICODE 1, or possibly pass that in on your compile commandline, there's a good chance that would solve your problem.

Unicode/Ascii决定主要由Unicode定义控制。因此,如果您#定义UNICODE 1,或者可能在编译命令行中传递它,那么很有可能解决您的问题。