【问题标题】:Translating Vista WinAPI C++ header for Delphi - any suggestions?为 Delphi 翻译 Vista WinAPI C++ 标头 - 有什么建议吗?
【发布时间】:2010-11-03 13:25:49
【问题描述】:

我需要从我的 Delphi 应用程序调用 Vista 中引入的 Windows API 函数,但我没有任何描述该函数的 Delphi 标头。

JEDI Windows API 库中已经记录了相关函数,但没有此函数。

我的 C++ 几乎不存在,我正在努力找出与函数相对应的 Delphi 定义,以及 MSDN 上记录的参数。

来自http://msdn.microsoft.com/en-us/library/aa814417.aspx

NETIOAPI_API GetIpInterfaceEntry(__inout  PMIB_IPINTERFACE_ROW Row);

typedef struct _MIB_IPINTERFACE_ROW {
  ADDRESS_FAMILY                 Family;
  NET_LUID                       InterfaceLuid;
  NET_IFINDEX                    InterfaceIndex;
  ULONG                          MaxReassemblySize;
  ULONG64                        InterfaceIdentifier;
  ULONG                          MinRouterAdvertisementInterval;
  ULONG                          MaxRouterAdvertisementInterval;
  BOOLEAN                        AdvertisingEnabled;
  BOOLEAN                        ForwardingEnabled;
  BOOLEAN                        WeakHostSend;
  BOOLEAN                        WeakHostReceive;
  BOOLEAN                        UseAutomaticMetric;
  BOOLEAN                        UseNeighborUnreachabilityDetection;
  BOOLEAN                        ManagedAddressConfigurationSupported;
  BOOLEAN                        OtherStatefulConfigurationSupported;
  BOOLEAN                        AdvertiseDefaultRoute;
  NL_ROUTER_DISCOVERY_BEHAVIOR   RouterDiscoveryBehavior;
  ULONG                          DadTransmits;
  ULONG                          BaseReachableTime;
  ULONG                          RetransmitTime;
  ULONG                          PathMtuDiscoveryTimeout;
  NL_LINK_LOCAL_ADDRESS_BEHAVIOR LinkLocalAddressBehavior;
  ULONG                          LinkLocalAddressTimeout;
  ULONG                          ZoneIndices[ScopeLevelCount];
  ULONG                          SitePrefixLength;
  ULONG                          Metric;
  ULONG                          NlMtu;
  BOOLEAN                        Connected;
  BOOLEAN                        SupportsWakeUpPatterns;
  BOOLEAN                        SupportsNeighborDiscovery;
  BOOLEAN                        SupportsRouterDiscovery;
  ULONG                          ReachableTime;
  NL_INTERFACE_OFFLOAD_ROD       TransmitOffload;
  NL_INTERFACE_OFFLOAD_ROD       ReceiveOffload;
  BOOLEAN                        DisableDefaultRoutes;
}MIB_IPINTERFACE_ROW, *PMIB_IPINTERFACE_ROW;

在其他位中,我现在正在努力解决的位是 ZoneIndices[ScopeLevelCount] 字段;我无法计算出数组的大小。

这是我到目前为止所定义的,虽然我还没有计算出原始 C++ 定义中的枚举。我将在 Vista 上显式加载 Windows DLL 并获取要调用的新函数的地址。

type
  PMIB_IPINTERFACE_ROW = ^MIB_IPINTERFACE_ROW;
  {$EXTERNALSYM PMIB_IPINTERFACE_ROW}
  _MIB_IPINTERFACE_ROW = record
    Family: ADDRESS_FAMILY;
    InterfaceLuid: NET_LUID;
    InterfaceIndex: NET_IFINDEX;
    MaxReassemblySize,
    InterfaceIdentifier,
    MinRouterAdvertisementInterval,
    MaxRouterAdvertisementInterval: Cardinal;
    AdvertisingEnabled,
    ForwardingEnabled,
    WeakHostSend,
    WeakHostReceive,
    UseAutomaticMetric,
    UseNeighborUnreachabilityDetection,
    ManagedAddressConfigurationSupported,
    OtherStatefulConfigurationSupported,
    AdvertiseDefaultRoute: LongBool;
    RouterDiscoveryBehavior: NL_ROUTER_DISCOVERY_BEHAVIOR;
    DadTransmits,
    BaseReachableTime,
    RetransmitTime,
    PathMtuDiscoveryTimeout: Cardinal;
    LinkLocalAddressBehavior: NL_LINK_LOCAL_ADDRESS_BEHAVIOR;
    LinkLocalAddressTimeout,
    ZoneIndices[ScopeLevelCount],
    SitePrefixLength,
    Metric,
    NlMtu: Cardinal;
    Connected,
    SupportsWakeUpPatterns,
    SupportsNeighborDiscovery,
    SupportsRouterDiscovery: LongBool;
    ReachableTime: Cardinal;
    TransmitOffload: NL_INTERFACE_OFFLOAD_ROD;
    ReceiveOffload: NL_INTERFACE_OFFLOAD_ROD;
    DisableDefaultRoutes: LongBool;
  end;
  {$EXTERNALSYM _MIB_IPINTERFACE_ROW}
  MIB_IPINTERFACE_ROW = _MIB_IPINTERFACE_ROW;
  {$EXTERNALSYM MIB_IPINTERFACE_ROW}
  TMibIpInterfaceRow = MIB_IPINTERFACE_ROW;
  PMibIpInterfaceRow = PMIB_IPINTERFACE_ROW;

const
  iphlpapilib = 'iphlpapi.dll';

var
  HIpHlpApi: THandle = 0;
  GetIpInterfaceEntry: function(const pArpEntry: MIB_IPINTERFACE_ROW): LongInt; stdcall;
  {$EXTERNALSYM GetIpInterfaceEntry}

有没有人有翻译这样的函数定义的建议或提示/技巧?

非常感谢,

康纳

【问题讨论】:

    标签: delphi winapi api windows-vista translation


    【解决方案1】:

    Win32 的BOOLEAN 类型是一个字节,而Delphi 的LongBool 类型是四个。请改用 Delphi 的 ByteBool

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      嗯。一个奇怪的结构。但是如果您查看 w2def.h,您可以看到 ScopeLevelCount=16。所以你的数组应该有 16 个元素,

      【讨论】:

        【解决方案4】:

        确保在定义记录时使用打包命令,因为默认情况下 Delphi 在 2、4 或 8 字节边界上对齐复杂数据类型。

        TExample = record 
         f1: Integer;   // start at offset 0x00
         f2: Char;      // start at offset 0x04 
         f3: Integer;   // start at offset 0x06 or 0x08 depending on alignment
        end;
        
        TExample = packed record // this is what c++ would do
         f1: Integer;   // start at offset 0x00
         f2: Char;      // start at offset 0x04 
         f3: Integer;   // start at offset 0x05
        end;
        

        【讨论】:

          【解决方案5】:

          ZoneIndices 数组应该这样定义:

          ZoneIndices : array [0..ScopeLevelCount - 1] of Cardinal;
          

          ScopeLevelCount 是一个 16 的常数

          【讨论】:

            【解决方案6】:

            我经常使用Dr. Bob's Header Converter 来完成这项任务,但大多数情况下我采用了手动执行转换的漫长而乏味的方式,因为它有助于我更好地理解 API。 (因为我要使用它,无论如何我必须熟悉它)

            另见这篇文章:http://www.delphi-jedi.org/api-howto.html

            一般来说,最好不要对标头转换工具寄予太大希望,因为 C++ 是一种非常强大和复杂的语言。我测试的大多数转换工具只支持 C++ 的一个子集及其预处理器,因此需要手动修复生成的源代码。

            【讨论】:

              【解决方案7】:

              您可以调查一些已翻译的与该主题相关的 API/结构并自行转换。例如this one

              【讨论】:

              • 谢谢,尽管与此相关的大多数功能都可以在 JEDI Windows API 标头项目等其他地方轻松获得。不幸的是,不是这个。 ;-)
              【解决方案8】:

              我在翻译中没有看到任何 ULONG64 类型的字段,但我在原文中看到了。

              此外,FPC 还有一个适用于结构的标头转换器。通常是打包 windows api 结构。

              有疑问,使用一些免费的 msvc 产品来编写 sizeof(structure) 并在 pascal 下做同样的事情。如果匹配,但您仍有疑问,请使用指针魔术计算字段偏移量并进行比较。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-04-04
                • 2021-04-20
                • 1970-01-01
                • 1970-01-01
                • 2010-09-25
                • 2018-10-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多