ID2D1RenderTarget是在d2d1.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

最佳答案

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

一种方法是在您的IDL / TLB文件中复制定义,但是我建议您接受IDL域中接口未定义的事实,而在其中使用IUnknown。类型库使用者始终可以对所涉及的接口执行IUnknown::QueryInterface

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

关于c++ - [MIDL]如何使用IDL文件中C/C++ header 中声明的接口(interface)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27479928/

10-13 06:57