Mfc 通过引用调用带有CString参数的函数时出错 来自C·I的最近被转移到Visual C++ 2010项目上。问题是我一天中的大部分时间都在使用CString,但办公室里没有人找到解决办法

Mfc 通过引用调用带有CString参数的函数时出错 来自C·I的最近被转移到Visual C++ 2010项目上。问题是我一天中的大部分时间都在使用CString,但办公室里没有人找到解决办法,mfc,c++-cli,Mfc,C++ Cli,情况是:2个具有相同设置的项目(打开unicode,在共享DLL中使用MFC,不使用ATL等) 在Project1中,我有这样一个函数: BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,CString &value) ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > auxiliar (m_cTe

情况是:2个具有相同设置的项目(打开unicode,在共享DLL中使用MFC,不使用ATL等)

在Project1中,我有这样一个函数:

BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,CString &value)
ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > auxiliar (m_cText) ;
ETextBoxWrapper::GetValue (m_txtText, auxiliar) ;
在Project2中,我调用上述函数,如下所示:

ETextBoxWrapper::GetValue (m_txtText, m_cText) ;//m_TxtText is a ETextBox and m_cText is a CString
编译Project1工作得很好。编译Project2时,我遇到一个错误:

接口::ControlsWrappers::ETextBoxWrapper::GetValue”:5个 重载可以转换所有参数类型>c:\MFLDR\interface.dialogbase.dll:可以是“int”

接口::ControlsWrappers::ETextBoxWrapper::GetValue(接口::控件::ETextBox^,长&)

接口::ControlsWrappers::ETextBoxWrapper::GetValue(接口::控件::ETextBox^,long&)

c:\MFLDR\einterface.dialogbase.dll:或'int>Interface::ControlsRappers::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\u t*)”

尝试匹配参数列表>“(Microsoft::VisualC::MFC::CWInformControl,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;
typedef ATL::CStringT>CStringW;
typedef ATL::CStringT>CStringA;
typedef ATL::CStringT>CString;
我将函数修改为如下所示:

在项目1中:

BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >&value)
BOOL-ETextBoxWrapper::GetValue(ETextBox^textBox,ATL::CStringT&value)
在Project2中,我这样调用上述函数:

BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,CString &value)
ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > auxiliar (m_cText) ;
ETextBoxWrapper::GetValue (m_txtText, auxiliar) ;
ATL::CStringT辅助语言(m_cText);
ETextBoxWrapper::GetValue(m_txtText,辅助);
编译错误发生了一些变化。第一部分保持不变,但最后:

尝试匹配参数列表时“(Microsoft::VisualC::MFC::CWInformControl,ATL::CStringT)” 使用[TManagedControl=Lantek::Expert::Interface::Controls::ETextBox] 和 [BaseType=wchar\u t,StringTraits=StrTraitMFC\u DLL]

如果我稍微扭曲一下,让项目1保持如下状态:

BOOL ETextBoxWrapper::GetValue (ETextBox ^textBox ,ATL::CStringT<BaseType,StringTraits> &value)
BOOL-ETextBoxWrapper::GetValue(ETextBox^textBox,ATL::CStringT&value)
然后,在没有编译的情况下,我自动得到一个错误,即BaseType和StringTraits都未定义

我不知道怎么了。看起来一个项目使用了一个CString定义,而另一个项目使用了不同的定义,但两者似乎都是从“afxstr.h”中获取定义的。我在网上读了很多书,但似乎没有人有这样的问题,或者至少我没有发现相关的问题


我在这里一无所知,所以任何帮助都将不胜感激。提前谢谢

看起来MFC的
CString
和ATL的
CString
之间有一个缩写


要验证这是否是问题所在,请尝试使用
ATL::CStringT
而不是
CString

感谢迄今为止收到的反馈。经过进一步调查,我们缩小了问题范围:

  • Project1使用CString的ATL定义(atlstr.h),Project2使用MFC定义。(afxstr.h)
尽管如此,我仍然无法做到这一点。我不明白他们是如何接受不同的定义的,因为项目设置显然是相同的(unicode、atl支持、crt等)


互联网上有一些关于MFC和ATL的CString定义的问题信息,但大多数信息在加入MFC ATL库之前就已经很旧了,问题通常是LNK2019。在我的V2015中,我得到了错误代码C2665。

最后我无法解决这个问题,所以我必须找到一个解决办法。我将一个CString封装在一个类中,我向另一个项目公开了这个类。我的getValue方法现在需要CStringPublic,但是用一个简单的CString调用这个getValue方法是可行的,所以我不需要在项目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);

你可以在测试变量中得到值。

查看代码,你已经显示了:你不是使用C++,而是使用C++ + cli.尝试包含<代码> CSTRGTH.H./CUT>头,其中包含了MFC代码> cStS/<代码>的定义class@SergeyShevchenko在Project1和Project2中相应的.cpp文件中执行此操作,但不幸的是,我总是犯同样的错误。无论如何谢谢你!好啊对我来说,很难猜出是怎么回事。如果你能用最少的代码创建一个示例项目来重现问题并将其上传到某个地方,那就太好了。是的,含糊不清是我的想法,但作为语言和框架的新手,我不知道该去哪里找。我尝试在GetValue中使用您的定义,但得到了与我相同的错误