VC2019不能使用CString参数(VC6.0内置)

Can not use CString parameter (which was built in VC6.0) at VC2019

我有一个用 VC6.0 构建的旧 DLL。

而且我想在VC2019项目中使用这个DLL。

这个DLL文件是一个MFC DLL,包含很多classes和函数。

除了这三个函数(包含CString参数)外classes和函数都没有问题

导出的DLL函数(class函数)如下:

class CColorListCtrl : public CListCtrl
{
    ...

public:
    int AddColumn(CString szHeaderStr, int nColWidth);
    int AddItem(CString szItem);
    bool SetItemTip(int nRow, int nCol, CString szTip);

    ...
}

link 错误如下:

error LNK2001: unresolved external symbol "public: int __thiscall CColorListCtrl::AddColumn(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >,int,int)" (?AddColumn@CColorListCtrl@@QAEHV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@HH@Z)

error LNK2001: unresolved external symbol "public: int __thiscall CColorListCtrl::AddItem(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >)" (?AddItem@CColorListCtrl@@QAEHV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z)

error LNK2001: unresolved external symbol "public: bool __thiscall CColorListCtrl::SetItemTip(int,int,class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >)" (?SetItemTip@CColorListCtrl@@QAE_NHHV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z)

DLL导出的函数如下:

?AddColumn@CColorListCtrl@@QAEHVCString@@HH@Z
?AddItem@CColorListCtrl@@QAEHVCString@@@Z
?SetItemTip@CColorListCtrl@@QAE_NHHVCString@@@Z

为了解决这个问题,我把Project Character Set(Project Setting -> General -> Character Set)改成“Use Multi-Byte Character Set”,问题还是没有解决。

我注意到CStringclass被改变了,所以VC6和VC2019的CStringclass不一样

我不知道如何解决这个问题。我也不能更改 DLL,因为我删除了这个 DLL 的项目。

请帮帮我。

谢谢。

这篇文章 (CStringT Class) 中有一些注释指出:

If your code contains the workaround for linker errors that is described in Exporting String Classes Using CStringT, you should remove that code. It is no longer needed.

我注意到它引用的后续文章指出:

In the past, MFC developers have derived from CString to specialize their own string classes. In Microsoft Visual C++.NET (MFC 8.0), the CString class was superseded by a template class called CStringT.

它解释了如何解决链接器问题。

VC++ 6 和 VC++ 2019 中的

CString 不兼容,因为存在差异。

即如果在VC6 dll中使用CString作为导出函数的参数,则无法在VS2019中直接调用VC6 dll。

我建议一种解决方案:

  1. 首先,创建一个dll,作为vc6中的转发器。这个 dll 的导出函数使用,例如,LPCTSTR 作为参数。设此dll为A.dll,原dll为B.dll.
  2. 在A.dll内部,调用了B.dll的导出函数,将结果转换为LPCTSTR返回。

VS2019调用了A.dll的导出函数。 LPCTSTR兼容VS2019和VS6,这样可以解决你的问题