繁体   English   中英

无法将'LPCWSTR {aka const wchar_t *}'转换为'LPCSTR {aka const char *}

[英]cannot convert 'LPCWSTR {aka const wchar_t*}' to 'LPCSTR {aka const char*}

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

正如我一直试图解决的问题,如果在代码块中编译glew实际上是可行的,我想在完成教程之前尝试使用源代码来查看它是否可行。

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

|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|

我的代码是

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;
}

(对不起文本墙)还有其他文件,但所有错误似乎都来自这里。 如果需要的话,其他人就会生病

我没有真正看到任何类似的错误所以我做了一些谷歌搜索,发现错误是由编译器没有设置为多字节(VS2010中的设置)引起的。 我做了一些环顾四周,无法在codeblocks中找到任何这样的设置。 这个代码只能在VS中使用还是我错过了什么? 我担心这可能与我的链接有关,因为我过去有很多问题。 任何帮助,将不胜感激。

更改CreateWindowExCreateWindowExW或定义宏UNICODE包括任何头前。

我从来没有使用过minGW,所以带上一大堆盐。 (VSW是免费使用的,BTW。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM