将BSTR从C ++传递给C#

时间:2011-06-07 06:49:02

标签: c++

我有C#项目“X”,我已将其中的方法暴露给C ++项目“Y”。

X的方法签名如下 -

public void WriteInformation(string sInfo)
{
    m_logger.ErrorInfo("{0}", sInfo);
}

当我使用.TLB文件将其导出到C ++时,我在.tlh文件中检查了此方法的声明,该文件在.tlb文件的#import上生成。

virtual HRESULT __stdcall WriteInformation ( /*[in]*/ BSTR sMsg ) = 0;

我在C ++项目中调用此方法并传递参数如下 -

oLog->WriteInformation(BSTR("Info write successful"));

这里的问题是从C ++传递的字符串总是变成垃圾或空,我调试了它,我可以看到sInfo的值总是垃圾或空。

请让我知道将字符串从C ++传递到C#应遵循的方法。

2 个答案:

答案 0 :(得分:3)

您尝试传递ANSI字符串代替BSTR。 BSTR必须是宽字符串。此外,您不应传递字符串文字,您应该使用SysAllocString()(或更好)包装类(ATL::CComBSTR_bstr_t)正确分配BSTR。顺便说一句_bstr_t有一个接受const char*的构造函数,并为您执行ANSI-> UTF16转换。

答案 1 :(得分:-2)

我认为不可能直接与C ++和C#交互。我使用C ++ / CLI包装器进行了交互。