来自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(接口:: 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的定义时,它在两个项目中都将我重定向到“ 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;
我将功能修改为:
在Project1中:
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]
如果我再扭一点,然后像这样离开Project 1:
BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,ATL::CStringT<BaseType,StringTraits> &value)
然后自动且未经编译,我收到一条错误消息,提示BaseType和StringTraits都未定义。
我不知道怎么了。似乎一个项目正在为CString使用一个定义,而另一个项目则为不同的定义,但是似乎两个项目都是从“ afxstr.h”获取该定义。我在互联网上阅读了很多书,但是似乎没有人遇到这样的问题,或者至少我没有找到相关的问题。
我在黑暗中,所以我们将不胜感激。提前致谢。
答案 0 :(得分:0)
似乎MFC的CString
和ATL的CString
之间存在歧义。
要验证这是问题所在,请尝试使用ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > >
代替CString
。
答案 1 :(得分:0)
感谢您到目前为止收到的反馈。经过更多调查,我们缩小了范围:
话虽如此,我仍然无法完成这项工作。我不理解它们如何采用不同的定义,因为项目设置-显然-是相同的(unicode,atl支持,crt等)。
Internet上有一些信息,涉及与MFC vs ATL的CString定义有关的问题,但其中大多数在加入mfc-atl库之前已经很老了,问题通常是LNK2019。在我的V2015中,我收到错误代码C2665。
答案 2 :(得分:0)
最后,我无法解决此问题,因此我不得不制定解决方法。我将CString封装在一个对其他项目公开的类中。现在,我的getValue方法需要CStringPublic,但可以使用简单的CString调用此getValue方法,因此我不必在Project 2中进行任何更改。
我的包装器类:
class CStringPublic {
public:
CStringPublic ( CString &string ) { m_string = &string ; }
CStringPublic& operator=(const CString &string) { *m_string = string ; return *this ; }
operator CString () { return *m_string ; }
private:
CString *m_string ;
} ;
GetValue方法:
BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,CStringPublic value)
您可以像这样调用GetValue:
CString test;
GetValue(textBox, test);
然后您将获得测试变量中的值。