gpt4 book ai didi

c# - 我如何使用来自 C# 的参数 BSTR* 和 BSTR** 调用遗留 C++ DLL 接口(interface)方法

转载 作者:行者123 更新时间:2023-11-28 05:26:48 26 4
gpt4 key购买 nike

开发者大家好

我已经在互联网上搜索了 2 天,了解如何做我需要做的事情,但我尝试了很多样本​​但没有成功。然而,这并不意味着我涵盖了所有网站 - 我认为我一只眼睛瞎了,另一只眼睛看不见。

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

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

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

接口(interface)签名为:

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

我需要从 C# 中调用它——我已经为 ISimpleChatServer 建立了接口(interface);因此,我正在尝试的代码调用是这样的。

string rtrnMsg = string.Empty;
ImySimpleCom.CallMe("罗伯特", rtrnMsg)

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

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

请记住,我无法更改库 - 它是一个“按原样”的遗留界面,我们需要再使用一段时间,并且提供者没有人相应地更新它(事实上我认为他们没有人来处理它)。

欢迎任何帮助。

亲切的问候,罗伯特·S.

最佳答案

在 .idl 中,接口(interface)应该是

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

那么它应该被改变,因为那是不正确的。

关于c# - 我如何使用来自 C# 的参数 BSTR* 和 BSTR** 调用遗留 C++ DLL 接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40404689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com