翻译Vista WinAPI C++;Delphi的标题-有什么建议吗?

翻译Vista WinAPI C++;Delphi的标题-有什么建议吗?,delphi,winapi,api,windows-vista,translation,Delphi,Winapi,Api,Windows Vista,Translation,我需要从我的Delphi应用程序调用Vista中引入的Windows API函数,但我没有任何描述该函数的Delphi头 绝地Windows API库中已经记录了相关函数,但没有记录此函数 我的C++几乎不存在,我正在努力找出与函数相关的德尔菲定义,它是MSDN.中记录的参数。 从 在其他比特中,我目前正在努力解决的比特是ZoneIndicates[ScopeLevelCount]字段;我无法计算数组的大小 这是我迄今定义的,虽然我还没有在原始C++定义中找出枚举。我将在Vista上显式加载Wi

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

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

<>我的C++几乎不存在,我正在努力找出与函数相关的德尔菲定义,它是MSDN.</P>中记录的参数。 从

在其他比特中,我目前正在努力解决的比特是ZoneIndicates[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}
有人对翻译这样的函数定义有什么建议或技巧吗

非常感谢,


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

也许你可以试试“C2 pas”

还发现了以下工具:


您可以调查一些与本主题相关的已经翻译的API/结构,并自己进行转换。例如

我经常用于此任务,但大多数情况下,我采用了手动执行转换的漫长而乏味的方式,因为这有助于我更好地理解API。(因为我要用它,无论如何我都得熟悉它)

另请参见本文:


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

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

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;

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

区域索引数组的定义如下:

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

ScopeLevelCount
是一个常数,为16

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

此外,FPC还有一个头部转换器,可以很好地用于结构。通常,windows api结构是打包的


毫无疑问,可以使用一些免费的msvc产品来编写sizeof(结构),并在pascal下执行同样的操作。如果匹配,并且您仍然有疑问,请使用一点指针魔法计算场偏移量并进行比较。

谢谢,尽管与此相关的大多数函数在绝地Windows API headers项目中以及其他地方都可用。只是不幸的不是这个
ZoneIndices : array [0..ScopeLevelCount - 1] of Cardinal;