gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:59 40 4
gpt4 key购买 nike

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

因为我一直在努力弄清楚在代码块中编译 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 中的设置)引起的。我环顾四周,但在代码块中找不到任何此类设置。这段代码只能在 VS 中使用还是我错过了什么?我担心这可能与我的链接有关,因为我过去对此有很多问题。任何帮助将不胜感激。

最佳答案

CreateWindowEx 更改为 CreateWindowExW 或在包含任何 header 之前定义宏 UNICODE

关于c++ - 无法将 'LPCWSTR {aka const wchar_t*}' 转换为 'LPCSTR {aka const char*},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11813767/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com