【问题标题】:[MIDL]How to use interfaces declared in c/c++ headers in idl files?[MIDL]如何在idl文件中使用c/c++头文件中声明的接口?
【发布时间】:2015-02-13 07:20:41
【问题描述】:

ID2D1RenderTargetd2d1.h 中定义的接口。我想像这样在我的 IDL 界面中使用它:

interface IXXX : IUnknown {
    HRESULT XXX([out, retval] ID2D1RenderTarget **_ppRT);
}

d2d1.idl 不包含在 SDK 中,我只能得到 d2d1.h(也没有 d2d1.tlb)。

我尝试使用 cpp_quote 包含 d2d1.h

cpp_quote("#include <d2d1.h>")

它提出了:

error MIDL2025: syntax error : expecting a type specification near "ID2D1RenderTarget"

然后我添加了一个typedef:

typedef struct ID2D1RenderTarget ID2D1RenderTarget;

错误改成这样:

error MIDL2011: unresolved type declaration : ID2D1RenderTarget [ Type 'ID2D1RenderTarget' ( Parameter '_ppRT' ) ]

我也尝试在包含之前添加cpp_quote("#define D2D_USE_C_DEFINITIONS"),但没有任何效果。

那么我应该怎么做才能在我的 IDL 文件中使用 ID2D1RenderTarget

【问题讨论】:

    标签: c++ visual-c++ com idl midl


    【解决方案1】:

    MIDL 编译器需要一个 IDL 文件来引用,或者一个类型库。 Direct2D 接口在这些方法中均不可用。它们也不能通过注册的类型库获得 - 您只能将它们作为 Windows SDK 中的 C++ 头文件。

    一种方法是在您的 IDL/TLB 文件中复制定义,但是我建议接受接口在 IDL 域中未定义的事实,并在那里使用IUnknown。类型库使用者始终可以为相关接口执行IUnknown::QueryInterface

    interface IXXX : IUnknown 
    {
        HRESULT XXX([out, retval] IUnkown** ppRendererTargetUnknown);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多