如何将字符串参数从c ++ com传递给c#?

时间:2016-09-17 09:30:42

标签: 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 个答案:

答案 0 :(得分:2)

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

此外,您不能简单地将字符串文字分配给BSTR。正确的方法是使用SysAllocString分配内存:*Param1 = SysAllocString(L"test1");

答案 1 :(得分: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的数据编组,反之亦然。