如何在 C++ 中创建一个公开返回对象的函数的 COM Dll?

Posted

技术标签:

【中文标题】如何在 C++ 中创建一个公开返回对象的函数的 COM Dll?【英文标题】:How to create a COM Dll in C++ that exposes a function which returns an object? 【发布时间】:2021-07-23 17:22:44 【问题描述】:

我有一个调用 C++COM Dll 的 WCF(C# 应用程序)应用程序。现在 C++ COM dll 暴露的方法具有以下签名。

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, OUT long *pVal)

现在我想返回一个具有多个属性的接口,而不是返回一个长 *pVal。有点像 -

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, OUT IData *pVal)

那么对于新接口我应该如何更新 COM DLL?那么我是否应该在 IDL 文件中为 IData 接口添加一个新条目。我是这个 COM C++ Dll 的新手。

【问题讨论】:

如果 IData 代表一个接口,是的,你应该在 idl 中声明它,就像任何其他接口一样(以便 idl 编译器可以编译它)。您可以在同一个 .idl 或另一个 .idl 中定义它并包含它。 @SimonMourier 好的,但是你能告诉我一个示例,比如在 idl 文件中编写像 IData 这样的接口的方法,它有两个属性,比如 DriverName 和 DriverId,并且是字符串输入? 您有现有的 idl 吗? properties 是 dispinterface 而不是 interface 的概念(一切都是方法):docs.microsoft.com/en-us/windows/win32/com/… 【参考方案1】:

你需要在你的 IDL 中有一个函数,比如(假设你的接口是 IMessageControl):

interface IMessageControl

   STDMETHOD(CallMe)(eEventType eventTypeVal, [out,retval] IData** pVal);

或者如果你想选择返回长或对象

interface IMessageControl

   STDMETHOD(CallMe)(eEventType eventTypeVal, [out,retval] VARIANT* pVal);

您的 C++ 代码将类似于:

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, IData** pVal)

   return E_NOTIMPL;

或用于变体版本

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, VARIANT* pVal)

   return E_NOTIMPL;

显然,一旦实现,返回 S_OK 表示良好的返回或 E_ 类型的错误代码表示失败。

【讨论】:

以上是关于如何在 C++ 中创建一个公开返回对象的函数的 COM Dll?的主要内容,如果未能解决你的问题,请参考以下文章

c++ 和 OpenGl:如何从类中创建网格对象实例

如何在不复制对象的情况下向 Python 公开返回 C++ 对象的函数?

在 C++ 中创建具有 2 个双精度值的类

在 C++ 中创建对象并将指针传递给 python

从 C++ 访问在 python 中创建的 C++ 类

在C++ 如何在堆中创建一个类的对象? 谢谢!