通过引用错误调用带有CString参数的函数

时间:2018-08-09 08:08:52

标签: mfc c++-cli

来自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 > 而不是< strong> 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;

我将功能修改为:

在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”获取该定义。我在互联网上阅读了很多书,但是似乎没有人遇到这样的问题,或者至少我没有找到相关的问题。

我在黑暗中,所以我们将不胜感激。提前致谢。

3 个答案:

答案 0 :(得分:0)

似乎MFC的CString和ATL的CString之间存在歧义。

要验证这是问题所在,请尝试使用ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > >代替CString

答案 1 :(得分:0)

感谢您到目前为止收到的反馈。经过更多调查,我们缩小了范围:

  • Project1使用CString的ATL定义(atlstr.h),Project2使用MFC定义。(afxstr.h)

话虽如此,我仍然无法完成这项工作。我不理解它们如何采用不同的定义,因为项目设置-显然-是相同的(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);

然后您将获得测试变量中的值。