Код реализации C в объявлении интерфейса

#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. До сих пор не найдено окончательного решения или точной причины, почему это могло произойти.