C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'

Posted

技术标签:

【中文标题】C++ 和 .NET - 从 \'System::String ^\' 转换为 \'_variant_t\'【英文标题】:C++ and .NET - Converting from 'System::String ^' to '_variant_t'C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t' 【发布时间】:2014-01-07 01:22:11 【问题描述】:

我正在开发一个托管 C++ 应用程序,该应用程序利用 C# 库来填充 ADO 记录集中的字段:

recordset->Fields->GetItem(L"Id")->Value = _variant_t(Library::IdGenerator->GenerateNewId());

但是,在将库返回的 .NET 字符串转换为 _variant_t 之前,我在将其添加到记录集之前遇到了错误。

这是我得到的错误:

error C2440: '<function-style-cast>' : cannot convert from 'System::String ^' to '_variant_t'

我是否错过了转换或强制转换以使其正常工作?

【问题讨论】:

【参考方案1】:

是的,需要转换。 _variant_t 类不是一个非常愉快的匹配,由于一个深不可测的原因,它缺少一个采用 BSTR 的构造函数,采用 _bstr_t 的构造函数没有吸引力,因为它复制了字符串。回退到原生 VARIANT 类型,如下所示:

using namespace System::Runtime::InteropServices;
...
    String^ s = Library::IdGenerator->GenerateNewId();
    VARIANT v =  VT_BSTR ;
    v.bstrVal = (BSTR)Marshal::StringToBSTR(s).ToPointer();
    recordset->Fields->GetItem(L"Id")->Value = v;

【讨论】:

工作就像一个魅力!非常感谢:)

以上是关于C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'的主要内容,如果未能解决你的问题,请参考以下文章