如何使用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
在。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],以允许字符串的传递-一旦他们纠正了这一点,一切都很好。
感谢大家-谢谢大家