接口声明中的C ++实现代码

问题描述

我正在将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 &renderingControls 
        )  
    {
        return SetRenderingControls(&renderingControls);
    }
}; // interface ID2D1DeviceContext

我知道该功能的第二个版本只是为了易于编程。 实际上,实现给定接口的对象没有该第二版本的代码。 接口的二进制级别没有插槽(接口实现为 指向方法的指针数组)。移植到Delphi时,我只能忽略第二个版本。 有人可以确认我的分析吗?

解决方法

只有标记为PURE(定义为=0)的方法才真正存在于最终的COM vtable中。

其他方法是包含仅可在C / C ++中使用的C / C ++代码的实用程序方法/包装器(它们将被编译),因此在使用其他语言(delphi,.NET等)时,请勿声明它们)

,

我们也在D2D1中对此进行调查,因为例如接口D2D1Svg.ID2D1SvgElement声明了其中的20个。

您可以在以下位置进行这些讨论/问题:Translation of C headers,在此处:MfPack/D2D1。到目前为止,还没有找到最终的解决方案或确切原因,为什么会发生这种情况。