BOOL CTestBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (! CDocument::OnOpenDocument(lpszPathName))
return FALSE;
m_pvtkBMPReader = vtkBMPReader::New();
m_pvtkBMPReader->SetFileName(lpszPathName);
return TRUE;
}
以上代码无法编译并产生C2664错误。为什么呢?
答案 0 :(得分:0)
您的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来简化字符串转换。