2016-09-17 122 views
0

我有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的:
enter image description here
当我打电话在C#这个COM DLL功能它显示我的错误:

IntPtr a = new IntPtr(); 
vina.test(a); 

它为空并且没有得到该值。
如何将C#中的变量传递给C++ com并传回?

回答

2

由于Param1被声明为[in, out]参数,您需要将其声明为一个指向BSTR:STDMETHODIMP TVinaImpl::test(BSTR* Param1)

而且,你不能简单地分配字符串文本到BSTR。正确的方法是分配内存使用SysAllocString*Param1 = SysAllocString(L"test1");

+0

如果有什么方法可以避免在C++中使用SysAllocString? –

+1

不幸的是,这是不可能的。 BSTR由COM管理,并且始终需要从其内存分配器中分配。如果不需要自动化兼容性,则可以考虑使用简单的'wchar_t *'代替。 – Aurora

+0

有什么办法在客户端(例如在C#中)分配内存并通过引用传递参数给C++方法? –

0

我建议你声明参数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

你说得对,但是当我想要返回多个参数来发送我的函数并返回它们时,我该怎么做。每个函数只能得到一个返回值。 –

相关问题