为64位编译器翻译IP_OPTION_INFORMATION32
和ICMP_ECHO_REPLY32
结构我在那里使用了数据类型。参考文献中的结构定义:
IP_OPTION_INFORMATION32结构:
typedef struct _IP_OPTION_INFORMATION32 {
UCHAR Ttl;
UCHAR Tos;
UCHAR Flags;
UCHAR OptionsSize;
UCHAR * POINTER_32 OptionsData;
} IP_OPTION_INFORMATION32, *PIP_OPTION_INFORMATION32;
我会这样翻译(对于Delphi XE2,64位目标平台)。如您所见,我不知道该结构的OptionsData
字段使用什么类型:
IP_OPTION_INFORMATION32 = record
Ttl: UCHAR;
Tos: UCHAR;
Flags: UCHAR;
OptionsSize: UCHAR;
OptionsData: // what should I use here for UCHAR * POINTER_32 ?
end;
ICMP_ECHO_REPLY32结构:
typedef struct icmp_echo_reply32 {
IPAddr Address;
ULONG Status;
ULONG RoundTripTime;
USHORT DataSize;
USHORT Reserved;
VOID * POINTER_32 Data;
struct ip_option_information32 Options;
} ICMP_ECHO_REPLY32, *PICMP_ECHO_REPLY32;
对于Delphi XE2 64位目标平台,我会写:
ICMP_ECHO_REPLY32 = record
Address: TIPAddr; // defined before
Status: ULONG;
RoundTripTime: ULONG;
DataSize: USHORT;
Reserved: USHORT;
Data: // what should I use here for VOID * POINTER_32 ?
Options: IP_OPTION_INFORMATION32;
end;
如何在Delphi中为64位平台目标定义UCHAR * POINTER_32
和VOID * POINTER_32
类型?据我所知,没有32位指针类型可用于64位平台目标,我只是不喜欢它被定义,例如作为Int32
类型: - )
上述类型的最精确翻译是什么?
答案 0 :(得分:4)
另一个Stack Overflow问题涵盖了POINTER_32
的问题:POINTER_32 - what is it, and why?
在对具有32位指针的不同进程中定义的结构执行interop时,可以使用它。
在Delphi中没有等效的__ptr32
,所以除了将其声明为32位整数之外别无选择。我会使用无符号类型。
答案 1 :(得分:0)
在这种情况下UInt32
(或Cardinal,DWORD等 - 任何无符号的32位)都没问题。您需要做的就是在结构(记录)的适当位置声明无符号32位。 CPU不关心,编译器不关心(如果需要你可以指向指针)它实际上是指针还是没有。即使是有符号的32位也可以工作,除非你用值和处理器的标志检查进行一些数学运算。
从C到Delphi的结构转换中的另一件事:确保原始对齐是4个字节(每个项目32位),因为record
与packed record
(无对齐)不同,默认情况下使用相同的4个字节对齐。否则,您可以通过将记录应用于
type
Picmp_echo_reply32 = ^icmp_echo_reply32;
...
data_size := Picmp_echo_reply32(@mybuf[some_offset]).DataSize;
或
var
icmp_echo: Picmp_echo_reply32;
...
icmp_echo := @buf[offset];
reserved := icmp_echo.Reserved;