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。
我建议一种解决方案:
- 首先,创建一个dll,作为vc6中的转发器。这个 dll 的导出函数使用,例如,
LPCTSTR
作为参数。设此dll为A.dll,原dll为B.dll.
- 在A.dll内部,调用了B.dll的导出函数,将结果转换为
LPCTSTR
返回。
VS2019调用了A.dll的导出函数。 LPCTSTR
兼容VS2019和VS6,这样可以解决你的问题
我有一个用 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), theCString
class was superseded by a template class calledCStringT
.
它解释了如何解决链接器问题。
CString
不兼容,因为存在差异。
即如果在VC6 dll中使用CString
作为导出函数的参数,则无法在VS2019中直接调用VC6 dll。
我建议一种解决方案:
- 首先,创建一个dll,作为vc6中的转发器。这个 dll 的导出函数使用,例如,
LPCTSTR
作为参数。设此dll为A.dll,原dll为B.dll. - 在A.dll内部,调用了B.dll的导出函数,将结果转换为
LPCTSTR
返回。
VS2019调用了A.dll的导出函数。 LPCTSTR
兼容VS2019和VS6,这样可以解决你的问题