如何使用c#中的参数BSTR*和BSTR**来调用遗留的c++ DLL接口方法?

本文关键字:BSTR c++ 方法 DLL 接口 何使用 参数 调用 | 更新日期: 2023-09-27 18:16:05

大家好

我已经在网上搜索了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"遗留接口,我们需要使用一段时间,提供者没有人相应地更新它(事实上我认为他们没有任何人在它上面工作)。

欢迎任何帮助。

Kind Regards, Robert s

如何使用c#中的参数BSTR*和BSTR**来调用遗留的c++ DLL接口方法?

在。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);

那么应该更改,因为这是不正确的。

谢谢大家。

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

感谢大家-谢谢大家