错误 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.但是你的 vtkSetFileName() 函数不支持 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 来简化字符串转换。