C++ 正在尝试用c++;,分配字符串时出错,LPCSTR/LPCWSTR
我在谷歌上搜索了几个小时,似乎什么都没用。 我不会把我的东西分成.h和.cpp,因为奇怪的东西是出于某种原因发生的,但这不是重点 我收到以下错误: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] 无法
无法在分配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
}
}
]
}