接口声明中的 C++ 实现代码
C++ Implementation code in an interface declaration
我正在将 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 中。
其他方法是实用程序 methods/wrappers,其中包含 C/C++ 代码,只能在 C/C++ 中使用(它们将被编译),因此您不能声明他们在使用另一种语言(delphi、.NET 等)
我们也在 D2D1 中对此进行调查,因为例如接口 D2D1Svg.ID2D1SvgElement 声明了大约 20 个。
您可以在此处关注这些 discussions/issues:Translation of C headers, here: MfPack/D2D1。到目前为止,还没有找到最终解决方案或确切原因,为什么会发生这种情况。
我正在将 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 中。
其他方法是实用程序 methods/wrappers,其中包含 C/C++ 代码,只能在 C/C++ 中使用(它们将被编译),因此您不能声明他们在使用另一种语言(delphi、.NET 等)
我们也在 D2D1 中对此进行调查,因为例如接口 D2D1Svg.ID2D1SvgElement 声明了大约 20 个。
您可以在此处关注这些 discussions/issues:Translation of C headers, here: MfPack/D2D1。到目前为止,还没有找到最终解决方案或确切原因,为什么会发生这种情况。