美好的一天开发者
我现在已经在互联网上搜索了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.
答案 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]以允许传回字符串 - 一旦他们纠正了,一切都很顺利。
非常感谢所有人 - 谢谢