3

我需要从我的 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}

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

非常感谢,

康纳

4

8 回答 8

2

Win32 的BOOLEAN类型是一字节,而 Delphi 的LongBool类型是四。改用德尔福的ByteBool

于 2009-06-17T13:47:13.930 回答
1

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

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

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

于 2009-06-17T12:39:51.320 回答
1

也许你可以试试“C 2 pas”

还发现了这些工具:

于 2009-06-17T07:13:41.197 回答
1

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

于 2009-06-17T05:08:43.203 回答
1

确保在定义记录时使用打包命令,因为默认情况下 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;
于 2009-06-17T13:00:59.860 回答
1

ZoneIndices 数组应该这样定义:

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

ScopeLevelCount是一个常数,即 16

于 2009-06-17T20:10:07.710 回答
0

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

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

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

于 2009-06-18T08:12:25.993 回答
0

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

于 2009-06-17T09:02:21.337 回答