#c #delphi #interface #direct2d
#c #delphi #интерфейс #direct2d
Вопрос:
Я переношу заголовочный файл d2d1_1.h на Delphi и застрял в объявлении интерфейса. В объявлении интерфейса есть методы, повторно объявленные с использованием фактического кода реализации, который вызывает. Вот пример (я показываю только соответствующую часть кода):
// d2d1_1.h line 1522
interface DX_DECLARE_INTERFACE("e8f7fe7a-191c-466d-ad95-975678bda998") ID2D1DeviceContext : public ID2D1RenderTarget
{
// d2d1_1.h line 1715
STDMETHOD_(void, SetRenderingControls)(
_In_ CONST D2D1_RENDERING_CONTROLS *renderingControls
) PURE;
// Lot of declarations ommited for simplicity
// d2d1_1.h line 2149
COM_DECLSPEC_NOTHROW
void
SetRenderingControls(
CONST D2D1_RENDERING_CONTROLS amp;renderingControls
)
{
return SetRenderingControls(amp;renderingControls);
}
}; // interface ID2D1DeviceContext
Я понимаю, что вторая версия функции предназначена только для упрощения программирования.
На самом деле, объект, реализующий данный интерфейс, не имеет кода для этой второй версии.
В интерфейсе нет слота на двоичном уровне (интерфейс реализован как
массив указателей на методы). Я могу просто игнорировать вторую версию при переносе на Delphi.
Может ли кто-нибудь подтвердить мой анализ?
Комментарии:
1. Конечно, просто используйте методы, помеченные как ЧИСТЫЕ. Другие являются несколько полезными оболочками.
2. @SimonMourier Спасибо! Вы можете переписать свой комментарий в качестве ответа. Я приму это.
Ответ №1:
Только метод, помеченный атрибутом PURE
(определенный как =0
), действительно существует в окончательной виртуальной таблице COM.
Другие методы являются служебными методами / оболочками, которые содержат код C / C , который может использоваться только на C / C (они будут скомпилированы), поэтому вы не должны объявлять их при использовании другого языка (delphi, .NET и т.д.)
Ответ №2:
Мы также исследуем это в D2D1, потому что, например, в интерфейсе D2D1Svg.ID2D1SvgElement их объявлено около 20.
Вы можете следить за этими обсуждениями / проблемами здесь: Перевод заголовков C, здесь: MfPack / D2D1. До сих пор не найдено окончательного решения или точной причины, почему это могло произойти.