如何将字符串参数从C++ com传递给c#?
问题描述:
我有C++代码,有这样的参数:如何将字符串参数从C++ com传递给c#?
STDMETHODIMP TVinaImpl::test(BSTR Param1)
{
try
{
Param1=(L"test1");
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IVina);
}
return S_OK;
}
我使用C++ Builder的:
当我打电话在C#这个COM DLL功能它显示我的错误:
IntPtr a = new IntPtr();
vina.test(a);
它为空并且没有得到该值。
如何将C#中的变量传递给C++ com并传回?
答
由于Param1
被声明为[in, out]
参数,您需要将其声明为一个指向BSTR:STDMETHODIMP TVinaImpl::test(BSTR* Param1)
而且,你不能简单地分配字符串文本到BSTR。正确的方法是分配内存使用SysAllocString
:*Param1 = SysAllocString(L"test1");
答
我建议你声明参数Param1为[out, retval]
。您没有将Param1用作任何输入。
STDMETHODIMP TVinaImpl::test(BSTR* Param1)
{
try
{
*Param1= SysAllocString(L"test1");
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IVina);
}
return S_OK;
}
然后,当你从C#调用函数它是正义的,
string s = vina.test();
.NET运行时管理从.NET数据的编组,以COM,反之亦然。
+0
你说得对,但是当我想要返回多个参数来发送我的函数并返回它们时,我该怎么做。每个函数只能得到一个返回值。 –
如果有什么方法可以避免在C++中使用SysAllocString? –
不幸的是,这是不可能的。 BSTR由COM管理,并且始终需要从其内存分配器中分配。如果不需要自动化兼容性,则可以考虑使用简单的'wchar_t *'代替。 – Aurora
有什么办法在客户端(例如在C#中)分配内存并通过引用传递参数给C++方法? –