您的位置:首页 > 其它

“error C2664: “MessageBoxW”: 不能将参数 2 从“char [300]”转换为“LPCWSTR” 1> 与指向的类型无关;转换要求 reinterpret_”问题解决

2016-01-12 10:03 896 查看
为什么出现这个问题呢,因为我读到一个opencv的程序,其中调用MessageBox,下面为MessageBox的定义:
MessageBox(
    HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
    )


其中,第2、3个参数定义为LPCTSTR,在程序中定义第二个参数为显示结果,如下图中的9

程序中采用下面程序记录结果:
int ret = svm.predict(SVMtrainMat);//检测结果
      sprintf(result, "%d",ret );


其中result为char数组类型,这时运行程序就会报错
1>i:\1 学习资料\c++\svm_hog\svm_hog\svm_hog.cpp(44): error C2664: “MessageBoxW”: 不能将参数 2 从“char [300]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换


因为其实MessageBox调用MessageBoxA,所以需要将第二个参数设置为LPCWSTR类型,而进行强制转换的话:
MessageBox(NULL,LPCWSTR(result),  TEXT("预测结果"), MB_OK);
会出现乱码现象:

有一个简单的方法:
项目——>属性——>配置属性——>常规——>项目默认值——>字符集:改成未设置

问题解决。
————————————————————————————————
分割线

下面介绍一下

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换

内容转自
/article/3627260.html
一.CString与LPCWSTR
两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。
CString转换成LPCWSTR
方法一:CString strFileName;
LPCWSTR lpcwStr = strFileName.AllocSysString();
方法二:CString str=_T("TestStr");

USES_CONVERSION;

LPCWSTR lpcwStr = A2CW((LPCSTR)str);
MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。
LPCWSTR转换成CString
LPCWSTR lpcwStr = L"TestWStr";

CString str(lpcwStr);
CString str;
LPWSTR lpstr = (LPWSTR)(LPCWSTR)str;
二.CString与LPSTR转换
CString转换成LPSTR:
方法一:CString strFileName;
LPSTR lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
方法二:CString strFileName;
LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;
LPSTR转换成CString:
LPSTR lpStr = L"TestStr";

CString str(lpStr);
注意:CString和LPCSTR可直接转换,如下:
CString str;
LPCSTR lpcStr = (LPCSTR)str;
三.CString和char*转换

CString转换成char*

方法一:CString str;

char* p = str.GetBuffer();

方法二:CString str;

char* p = (LPSTR)(LPCSTR)str;

char*转换成CString

char* p = "test";

CString str = ("%s",p);
四.String和int、float的转换
可以使用atoi,atof,atol等函数来完成。
五.LPSTR(char*)和LPWSTR的转换
可以使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,可以避免转换。
ATL宏介绍:
A2BSTR OLE2A T2A W2A

A2COLE OLE2BSTR T2BSTR W2BSTR

A2CT OLE2CA T2CA W2CA

A2CW OLE2CT T2COLE W2COLE

A2OLE OLE2CW T2CW W2CT

A2T OLE2T T2OLE W2OLE

A2W OLE2W T2W W2T
A :ANSI 字符串,也就是 MBCS。

W、OLE 宽字符串,也就是 UNICODE。

T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A

C const 的缩写
利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;

2、不要试图在一个次数比较多的循环体内进行转换;

3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;

4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
void Func1(LPSTR lpStr);
void Func2(LPWSTR lpwStr);
TCHAR name[256];
TCHAR* pName = new TCHAR[256];
Func1(name); // Func1(pName);
Func2(name); // Func2(pName);
注意在VS2005中上面用红色标记的代码已经不成立。
VS2005中CString已经改为宽字符型,一些转换如下:
char name[10];

TCHAR sex[5] ;

char *p = name;

TCHAR *pw = sex;
LPSTR lpstr = name;

LPCSTR lpcstr = name;

lpcstr = lpstr;



lpstr = p;

p = (char*)sex;

pw = (WCHAR*)name;

LPWSTR lpwstr = (LPWSTR)lpstr;

lpwstr = (LPWSTR)lpcstr;

LPCWSTR lpcwstr = (LPCWSTR)lpstr;

lpcwstr = (LPCWSTR)name;
CString str(lpstr);

CString str1(lpcstr);

CString str2(lpwstr);

CString str3(lpcwstr);

CString str4(name);

CString str5(sex);
lpwstr = (LPWSTR)(LPCWSTR)str;

lpstr = (LPSTR)(LPCWSTR)str;

lpcstr = (LPCSTR)(LPCWSTR)str;
p = (char*)str.GetBuffer();

pw = str.GetBuffer();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: