错误C2664:'void vtkImageReader2 :: SetFileName(const char *)':无法将参数1从'LPCTSTR'转换为'const char *'

时间:2017-02-15 10:57:37

标签: visual-c++ vtk

BOOL CTestBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
    if (! CDocument::OnOpenDocument(lpszPathName))
        return FALSE;

    m_pvtkBMPReader = vtkBMPReader::New();
    m_pvtkBMPReader->SetFileName(lpszPathName);

    return TRUE;
 }

以上代码无法编译并产生C2664错误。为什么呢?

1 个答案:

答案 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来简化字符串转换。