在 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 互操作方法中将字符串作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章