我的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并传回去?
答案 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的数据编组,反之亦然。