[MIDL]如何在idl文件中使用c / c ++头文件中声明的接口?

时间:2014-12-15 08:23:33

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

ID2D1RenderTargetd2d1.h中定义的界面。我想在我的IDL界面中使用它,如下所示:

interface IXXX : IUnknown {
    HRESULT XXX([out, retval] ID2D1RenderTarget **_ppRT);
}
SDK中未包含

d2d1.idl,我只能获得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

1 个答案:

答案 0 :(得分:1)

MIDL编译器需要一个IDL文件来验证,或者需要一个类型库。 Direct2D接口不适用于任何这些方法。它们也不能通过注册类型库获得 - 您只能将它们作为Windows SDK中的C ++标题。

一种方法是在IDL / TLB文件中复制定义,但我建议接受IDL域中未定义接口并在其中使用IUnknown这一事实。对于相关接口,类型库使用者总是可以IUnknown::QueryInterface

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