【问题标题】:How to create a COM Dll in C++ that exposes a function which returns an object?如何在 C++ 中创建一个公开返回对象的函数的 COM Dll?
【发布时间】: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/…

标签: c++ dll com idl


【解决方案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_ 类型的错误代码表示失败。

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 2017-09-24
    • 2011-09-10
    • 2023-03-16
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多