visual [MIDL] Как использовать интерфейсы, объявленные в заголовках c / c ++, в файлах idl?

ID2D1RenderTarget это интерфейс, определенный в d2d1.h, Я хочу использовать его в моем интерфейсе IDL следующим образом:

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

d2d1.idl не входит в SDK, и я могу только получить d2d1.h(тоже не d2d1.tlb).

Я пытался в том числе d2d1.h используя cpp_quote:

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") до включения но ничего не сделал.

Итак, что я должен сделать, чтобы использовать ID2D1RenderTarget в моих файлах IDL?

0

Решение

Компилятору MIDL нужен файл IDL для ссылки или библиотека типов. Интерфейсы Direct2D недоступны ни одному из этих методов. Они также не доступны через зарегистрированную библиотеку типов — они есть только в качестве заголовков C ++ в Windows SDK.

Одним из способов будет дублирование определений в вашем файле IDL / TLB, однако я рекомендую принять тот факт, что интерфейсы не определены в домене IDL, и использовать IUnknown там вместо Потребитель библиотеки типов всегда может сделать IUnknown::QueryInterface для рассматриваемого интерфейса.

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

Другие решения


По вопросам рекламы [email protected]