win32学校应用程序上的c++构建错误
c++ build errors on win32 school application
我用c++编程的时间不长,但需要为我的学校制作一个Win32应用程序。老师在信息方面帮了我很多,但经过几天的努力,我还是被卡住了。
错误:
error C2440: '=' : cannot convert from 'const char [11]' to 'LPCWSTR'
error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [11]' to 'LPCWSTR'
error C2664: 'TextOutW' : cannot convert parameter 4 from 'char *' to 'LPCWSTR'
IntelliSense: argument of type "char *" is incompatible with parameter of type "LPCWSTR"
不知道是否所有其他的后缀都是正确的,但我现在只得到那4个错误
cpp文件:
/* Hoofdstuk 10, User Interface */
#include "Callback_NYCM.h"
// UI
int WINAPI WinMain(HINSTANCE thisInstance,HINSTANCE prevInstance,LPSTR lpCmdLine,int nShowCmd)
{
PAINTSTRUCT ps;
HDC hdc;
MSG msg;
HWND hwnd;
WNDCLASSEX wndclassex; //struct_WNDCLASSEX via windows.h
// toekenning
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = thisInstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor(thisInstance,IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = "WNDCLASSEX";
wndclassex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
// functie aanroep
RegisterClassEx(&wndclassex);
// IfThen -> CreateWindows
if(!(hwnd = CreateWindowEx(NULL,"WNDCLASSEX","Hoofdstuk 10",WS_OVERLAPPEDWINDOW
| WS_VISIBLE,50,50,650,300,NULL,NULL,thisInstance,NULL)))
{
return 0;
}
// logische structuur
while(GetMessage(&msg, NULL, 0, 0))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
};
头文件:
/*Hoofdstuk 10, Deelnemer.h*/
//Declaratie
class Deelnemer
{
private:
char* nm;
public:
//Constructor
Deelnemer(){
}
//Methoden = prototype
void Deelnemer::Invoeren();
char* Deelnemer::WeergevenNaam();
};
//Implemenmtatie.Invoeren
void Deelnemer::Invoeren()
{
nm = "Roy";
}
//.Weergeven
char* Deelnemer::WeergevenNaam()
{
return nm;
}
callback_NYCM.h:
/*Hoofdstuk 10, Callback_NYCM*/
#include "Windows.h"
#include "Deelnemer.h"
// prototype
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
//Implementatie
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//Constructie
PAINTSTRUCT ps;
HDC hdc;
MSG msg;
WNDCLASSEX wndclassex;
// HWND hwnd;
Deelnemer deelnemer1;
//UI
switch(message)
{
case WM_PAINT:
{
//Functieaanroep.Initialisatie
deelnemer1.Invoeren();
//.TextOut
TextOut(hdc,50,50,deelnemer1.WeergevenNaam(),
strlen(deelnemer1.WeergevenNaam()));
EndPaint(hwnd,&ps);
return 0;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
break;
default:
{
return DefWindowProc(hwnd,message,wparam,lparam);
}
break;
}
return 0;
}
我认为我的构造函数或类似的东西是错误的,我的char*Deelnemer::WeergevenNaam()的返回值
有人能解释一下我的代码出了什么问题吗?这样我就知道如何让它工作了?
更新:
更新应用程序需要使用UNICODE字符串文字贯穿始终,即L"MyString",而不是"MyString"。你还需要使用WCHAR/WCHAR_t代替字符
但是我该如何处理我的代码,有人能帮忙吗?
更新2:
这解决了很多错误!
但是我在这个部分还有一些错误
Deelnemer deelnemer1;
switch(message)
{
case WM_PAINT:
{
//Functieaanroep.Initialisatie
deelnemer1.Invoeren();
//.TextOut
TextOut(hdc,50,50,deelnemer1.WeergevenNaam(),
strlen(deelnemer1.WeergevenNaam()));
EndPaint(hwnd,&ps);
return 0;
}
因此错误出现在第行:deelnemer1。WeergevenNaam()
-TextOutW':无法将参数4从"char*"转换为"LPCWSTR"
-IntelliSense:"char*"类型的参数与"LPCWSTR"类型的参数不兼容
更新3:
经过一些测试,我找到了一个解决方案(就像你们下面说的),但现在我只剩下这个了:TextOut (hdc,50,50,deelnemer1.WeergevenNaam(),
//在deelnemer1.weargevenNaam()上
出现错误C2664:"TextOutW":无法将参数4从"const char*"转换为"LPCWSTR"
您的代码是为编译为ANSI而编写的,但您的解决方案设置包括_UNICODE
/UNICODE
。您可以通过将字符集(在配置属性的常规节点上)从使用Unicode字符集更改为多字节字符集来将解决方案设置为使用ANSI编码,或者更新应用程序代码(建议使用后者)。
更新应用程序需要始终使用UNICODE字符串文字,即L"MyString"
而不是"MyString"
。您还需要使用WCHAR
/wchar_t
来代替char
(如果适用),并调用Windows API的广泛版本。对于许多API调用,存在结尾有W
的宽版本,例如CreateWindowExW
。如果您使用的是标准C++库,您还需要确保在需要字符编码的地方使用UNICODE变体(例如std::wstring
而不是std::string
)。其他信息可以在Visual C++中的"文本和字符串"中找到。
关于这里发生的更多背景:Windows API和Microsoft的CRT实现可以用于使用ANSI/多字节字符集或UNICODE字符集编译代码。为了支持两种字符编码,C/C++预处理器根据是否定义了_UNICODE
和UNICODE
预处理器符号,用特定的实现替换相应的字符类型和API调用。
例如,呼叫CreateWindowEx
被扩展为CreateWindowExA
或CreateWindowExW
。两种实现都具有不同的字符串参数类型(分别为char*
和wchar_t*
)。要使用ANSI/多字节编码,调用将为CreateWindowExA(NULL,"WNDCLASSEX",...)
。对于UNICODE,它看起来像CreateWindowExW(NULL,L"WNDCLASSEX",...)
。
要查看预处理器完成后的代码外观,可以使用/p或/E编译器开关(假设您使用的是Microsoft编译器)。
注意:不要忘记阅读《绝对最小值》每个软件开发人员绝对、积极地必须了解Unicode和字符集(没有借口!)
简单答案-没有解释的原因
将带引号的字符串更改为L"foo"
将char更改为wchar_t
LPCWSTR->指向常量宽字符串的长指针。
您的所有错误消息都简化为某种形式的char[XX]与wchar_t[XX]的类型不同。
微软的Win32 API被设计为使用ANSI字符串、字符或宽字符串wchar_t进行编译。这就是为什么许多Win32函数有两个签名,一个以A结尾,另一个以W结尾。
示例:
CreateWindowExW
CreateWindowExA
CreateWindowEx-一个宏,根据您的构建配置扩展到上面的签名之一。如果定义UNICODE或_UNICODE,它将扩展到W版本。
通常,在Win32中编程时使用宏,并使用_T宏包装所有字符串文字。当定义字符串字符数组时,您需要使用LPCTSTR和LPTSTR。这些宏也将根据您的构建设置扩展为char*或wchar_t*。
我让它工作。使用wchar_t*和L"字符串"。我的代码问题更多的是结构,因为复制/粘贴到一个新项目解决了我的错误。谢谢大家!
通过在Project > Property > Configuration Properties > General
中的Character Set
上选择"未设置",我能够删除错误C2440
和C2264
。
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 用CMake构建C++协议
- Mingw-64 在构建和安装后不会编译 openCV 代码