如何使用C#

时间:2016-11-03 14:55:01

标签: c# c++ interface com bstr

美好的一天开发者

我现在已经在互联网上搜索了2天如何做我需要的东西,我尝试了很多样本​​但都没有成功。然而,这并不意味着我覆盖了所有网站 - 我想我一只眼睛失明,看不到另一只眼睛。

无论如何,我收到了一张带有COM自动化接口定义的单张纸,并被要求开发一个C#应用程序来相应地使用接口和回调。

所以,开始简单(或者我认为) - C ++方法签名是:

STDMETHODIMP CSimpleChatServer::CallMe(BSTR clientName, BSTR** returnMessage)

,界面签名为:

HRESULT _stdcall CallMe([in] BSTR clientName, [in] BSTR** helloMessage);

我需要从C#调用它 - 我已经为ISimpleChatServer建立了接口;因此,我正在尝试的代码调用就像。

string rtrnMsg = string.Empty; ImySimpleCom.CallMe("Robert", rtrnMsg)

由于签名是[in],我在尝试访问受保护的内存时遇到异常。

现在,我相信它想要一个IntPtr作为第二个参数;然而,我所有想要采取的尝试都失败了。

请记住,我无法更改图书馆 - 这是" As Is"遗留接口,我们需要使用一段时间,而提供商没有人相应地更新它(实际上我认为他们没有任何人可以使用它)。

欢迎任何帮助。

亲切的问候,Robert S.

2 个答案:

答案 0 :(得分:1)

在.idl中,界面应为

HRESULT _stdcall CallMe([in] BSTR clientName, 
                        [out,retval] BSTR** helloMessage);

所以只需从CallMe

获取返回值
SimpleChatServer mySimpleCom = new SimpleChatServer();   
string helloMessage = mySimpleCom( clientName );

当您在C ++ / C方法中返回字符串时,使用SysAllocString进行分配,并通过分配给helloMessage将其返回给调用者。

*helloMessage = SysAllocString(L"MyString");

以上所有假设您已在C#项目中引用了COM服务器。

我现在更仔细地阅读你的问题,所以你不能改变"遗产"码?如果它说

HRESULT _stdcall CallMe([in] BSTR clientName, 
                        [in] BSTR** helloMessage);

然后应该更改,因为这是不正确的。

答案 1 :(得分:0)

谢谢All和Andres

我终于与客户联系了,是的,他们提供的信息不正确,[in]属性应该是[out,retval]以允许传回字符串 - 一旦他们纠正了,一切都很顺利。

非常感谢所有人 - 谢谢