错误 C2664:'void vtkImageReader2::SetFileName(const char *)':无法将参数 1 从 'LPCTSTR' 转换为“const char *”
error C2664: 'void vtkImageReader2::SetFileName(const char *)' : cannot convert argument 1 from 'LPCTSTR' to 'const char *"
BOOL CTestBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (! CDocument::OnOpenDocument(lpszPathName))
return FALSE;
m_pvtkBMPReader = vtkBMPReader::New();
m_pvtkBMPReader->SetFileName(lpszPathName);
return TRUE;
}
以上代码无法编译并产生 C2664 错误。为什么?
您的 VC++ 项目被设置为 UNICODE 因此所有对 TCHAR
的引用都被解析为宽字符类型 w_char
.但是你的 vtk 的 SetFileName()
函数不支持 UNICODE 因此编译错误。
要解决此问题,您应该更改项目的属性以使用 ASCII 或 MBCS(取决于您的需要)或执行手册 UNICODE-> MBCS(或成ASCII)转换。
以下是如何使用系统代码页将 UNICODE 转换为 MBCS 的示例:
const size_t fnameLen = 1024;
char * fname[fnameLen];
int converted = WideCharToMultibyte(
CP_ACP
, WC_COMPOSITECHECK | WC_ERR_INVALID_CHARS
, lpszPathName
, -1 // null-terminated string
, fname
, fnameLen
, NULL // or whatever you'd like it to be
, NULL);
m_pvtkBMPReader->SetFileName(fname); // <-- this should work now as it is char*
请注意,我只是在没有编译的情况下写下该代码,因此在正确构建和运行之前,您可能需要进行一些调整。
ATL 和 MFC 提供了 bunch of convenient macroses 来简化字符串转换。
BOOL CTestBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (! CDocument::OnOpenDocument(lpszPathName))
return FALSE;
m_pvtkBMPReader = vtkBMPReader::New();
m_pvtkBMPReader->SetFileName(lpszPathName);
return TRUE;
}
以上代码无法编译并产生 C2664 错误。为什么?
您的 VC++ 项目被设置为 UNICODE 因此所有对 TCHAR
的引用都被解析为宽字符类型 w_char
.但是你的 vtk 的 SetFileName()
函数不支持 UNICODE 因此编译错误。
要解决此问题,您应该更改项目的属性以使用 ASCII 或 MBCS(取决于您的需要)或执行手册 UNICODE-> MBCS(或成ASCII)转换。
以下是如何使用系统代码页将 UNICODE 转换为 MBCS 的示例:
const size_t fnameLen = 1024;
char * fname[fnameLen];
int converted = WideCharToMultibyte(
CP_ACP
, WC_COMPOSITECHECK | WC_ERR_INVALID_CHARS
, lpszPathName
, -1 // null-terminated string
, fname
, fnameLen
, NULL // or whatever you'd like it to be
, NULL);
m_pvtkBMPReader->SetFileName(fname); // <-- this should work now as it is char*
请注意,我只是在没有编译的情况下写下该代码,因此在正确构建和运行之前,您可能需要进行一些调整。
ATL 和 MFC 提供了 bunch of convenient macroses 来简化字符串转换。