翻译Vista WinAPI C++;Delphi的标题-有什么建议吗?
我需要从我的Delphi应用程序调用Vista中引入的Windows API函数,但我没有任何描述该函数的Delphi头 绝地Windows API库中已经记录了相关函数,但没有记录此函数 <>我的C++几乎不存在,我正在努力找出与函数相关的德尔菲定义,它是MSDN.</P>中记录的参数。 从 在其他比特中,我目前正在努力解决的比特是ZoneIndicates[ScopeLevelCount]字段;我无法计算数组的大小 <>这是我迄今定义的,虽然我还没有在原始C++定义中找出枚举。我将在Vista上显式加载Windows DLL,并获取要调用的新函数的地址翻译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
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”
一般来说,最好不要对头转换工具寄予很大的希望,因为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;