title: Translating Vista WinAPI C++ header for Delphi - any suggestions?
body: <p>I'm needing to call a Windows API function introduced in Vista from my Delphi app, but I don't have any Delphi headers which describe the function.</p>
  
  <p>Related functions are already documented in the JEDI Windows API library, but not this function.</p>
  
  <p>My C++ is almost non-existent, and I'm struggling to work out the Delphi definitions that correspond to the function and it's parameter as documented on MSDN.</p>
  
  <p>From <a href="http://msdn.microsoft.com/en-us/library/aa814417.aspx" rel="nofollow noreferrer">http://msdn.microsoft.com/en-us/library/aa814417.aspx</a></p>
  
  <pre><code>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;
  </code></pre>
  
  <p>Among other bits, the bit I'm struggling with at the minute is the ZoneIndices[ScopeLevelCount] field; I can't work out what size the array is supposed to be.</p>
  
  <p>This is what I've defined so far, although I haven't worked out the enums in the original C++ definition yet.  I'll be explicitly loading the Windows DLL on Vista and getting the address of the new function to call.</p>
  
  <pre><code>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}
  </code></pre>
  
  <p>Does anybody out there have suggestions or tips/tricks for translating a function definition like this?</p>
  
  <p>Many thanks,</p>
  
  <p>Conor</p>