【发布时间】:2019-01-16 14:46:41
【问题描述】:
来自 C# 我最近被调去从事一个 Visual C++ 2010 项目。问题是我在一天中的大部分时间都被 CString 的使用所困扰,办公室周围没有人找到解决方案。
情况是:2 个项目具有相同的设置(unicode 开启、在共享 DLL 中使用 MFC 和不使用 ATL 等)。
在 Project1 中我有这样的功能:
BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,CString &value)
从 Project2 中,我这样调用上面的函数:
ETextBoxWrapper::GetValue (m_txtText, m_cText) ;//m_TxtText is a ETextBox and m_cText is a CString
编译 Project1 工作正常。编译Project2时出现错误:
Interface::ControlsWrappers::ETextBoxWrapper::GetValue' : 没有 5 个 重载可以转换所有参数类型 >c:\MFLDR\interface.dialogbase.dll: 可以是 'int
Interface::ControlsWrappers::ETextBoxWrapper::GetValue(Interface::Controls::ETextBox ^,long &)
Interface::ControlsWrappers::ETextBoxWrapper::GetValue(Interface::Controls::ETextBox ^,long &)'
c:\MFLDR\einterface.dialogbase.dll: 或 'int >Interface::ControlsWrappers::ETextBoxWrapper::GetValue(Interface::Controls::ETextBox ^,int &)'
c:\MFLDR\interface.dialogbase.dll: 或'int Interface::ControlsWrappers::ETextBoxWrapper::GetValue(Interface::Controls::ETextBox ^,double &)'
c:\MFLDR\interface.dialogbase.dll: 或 'int Interface::ControlsWrappers::ETextBoxWrapper::GetValue(Interface::Controls::ETextBox ^, ATL::CStringT > &)'
c:\MFLDR\interface.dialogbase.dll: 或'int Interface::ControlsWrappers::ETextBoxWrapper::GetValue(Interface::Controls::ETextBox ^,wchar_t *)'
在尝试匹配参数列表时 >'(Microsoft::VisualC::MFC::CWinFormsControl, CString)' 与 [ TManagedControl=Interface::Controls::ETextBox ]
粗体重载是它应该检测为 CString 的重载,但它要求 ATL::CStringT > 而不是 CString.
正如你在最后看到的,调用函数正确地将 CString 识别为 CString。
当转到 CString 的定义时,它会将我重定向到两个项目中的“afxstr.h”,发现:
typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
我将函数修改为如下所示:
在项目 1 中:
BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >&value)
在 Project2 中,我这样调用上述函数:
ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > auxiliar (m_cText) ;
ETextBoxWrapper::GetValue (m_txtText, auxiliar) ;
并且编译错误发生了一些变化。第一部分保持不变,但在最后:
在尝试匹配参数列表“(Microsoft::VisualC::MFC::CWinFormsControl, ATL::CStringT)”时 与 [ TManagedControl=Lantek::Expert::Interface::Controls::ETextBox ] 和 [ BaseType=wchar_t, StringTraits=StrTraitMFC_DLL ]
如果我稍微扭曲一下,然后像这样离开项目 1:
BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,ATL::CStringT<BaseType,StringTraits> &value)
然后自动且不编译我得到一个错误,说 BaseType 和 StringTraits 都是未定义的。
我不知道怎么了。似乎一个项目对 CString 使用一个定义,而另一个项目使用不同的定义,但两者似乎都是从“afxstr.h”中获取定义。我在互联网上阅读了很多,但似乎没有人遇到这样的问题,或者至少我没有找到相关的问题。
我在这里一无所知,因此我们将不胜感激。提前致谢。
【问题讨论】:
-
查看代码,sn-ps 显示:您不是使用 C++,而是使用 C++/CLI。
-
尝试包含
cstringt.h标头,其中包含 MFCCString类的定义 -
@SergeyShevchenko 在 Project1 和 Project2 的相应 .cpp 文件中完成了该操作,但不幸的是我一直收到相同的错误。还是谢谢!
-
好的。对我来说,很难猜出哪里出了问题。如果您可以使用最少的代码创建一个示例项目来重现问题并将其上传到某处,那就太好了。