如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章