在 COM 互操作方法中将字符串作为参数传递

Posted

技术标签:

【中文标题】在 COM 互操作方法中将字符串作为参数传递【英文标题】:Passing a string as an argument in COM Interop methods 【发布时间】:2012-06-28 15:52:42 【问题描述】:

我有一个需要使用 COM 互操作与 .NET dll 交互的 c++ 类。

我有:

1。 C++调用的方法,操作对象为.net实例:

   m_pCommManager.CreateInstance(__uuidof(CHmHTTPManager));
    m_pCommManager->Communicate(/*string parameter*/);

2。 具有以下方法的 .net 接口,C++ 类应遵守该方法:

 void ResponseRecieved(/*string parameter*/)

我的问题是:我应该选择的参数类型是:

A. 易于在两侧作为字符串进行操作(即使通过强制转换)。

B. 两种环境都可以接受(我不能对 C++ 和 .net 使用“字符串”,因为它不一样)

非常欢迎具体的使用示例。

【问题讨论】:

【参考方案1】:

您应该在 C++ 中使用 BSTR 字符串。

来自 MSDN:

BSTR 是一种复合数据类型,由长度前缀、 数据字符串和终止符。下表描述了这些 组件。

BSTR 是使用 COM 内存分配函数分配的,因此它们可以 从方法中返回而不考虑内存分配。

在您的 COM 对象的 IDL 文件中,它将是:

HRESULT mySampleMethod([in] BSTR mySampleParam);

C++ 中实际代码的外观将取决于您正在开发的 COM 对象/类型库的类型(我的意思是您使用的是基于 MFC 的 COM 对象还是基于 ATL 的 COM 对象)。在任何情况下,我都建议您使用 Visual Studio 中的向导来创建/修改您的类型库。

在.Net端,你只是使用普通的字符串类型,如果参数在你的COM对象的类型库中定义为BSTR,它会自动封送。

您可能还会发现这个问题很有用:

Convention for passing BSTRs into COM functions from C# (COM interop)

【讨论】:

在 .net 端我该怎么办?

以上是关于在 COM 互操作方法中将字符串作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个条目中将RGB作为单独的参数传递给函数

在python 3中将参数传递给exec

如何在 Python 中将方法作为参数传递

在辅助方法中将 self 作为参数传递

在 Django 中将文件路径作为 URL 参数传递

如何在Java中将泛型对象作为方法参数传递? [复制]