gpt4 book ai didi

delphi - 将 FILETIME 等结构视为 UInt64/Int64

转载 作者:行者123 更新时间:2023-12-03 15:00:57 24 4
gpt4 key购买 nike

在我阅读 MSDN 博客文章 Why can't you treat a FILETIME as an __int64? 后出现了这个问题。该文章表示,将 FILETIME 转换为 __int64 会创建未对齐的指针。

Windows header 中声明的

FILETIMELUIDLUID_AND_ATTRIBUTES 结构体如下:

  typedef struct FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
}

typedef struct LUID {
ULONG LowPart;
LONG HighPart;
}

typedef struct LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
}

由于 FILETIMELUID 结构具有相似的布局,因此将 LUID 视为 __int64 也可以创建一个未对齐的指针。然而,Windows.pas(这里是 Delphi XE3)实践了这一点——例如:

  {$ALIGN 4}
LUID_AND_ATTRIBUTES = record
Luid : Int64; // Here, LUID is treated as Int64
Attributes: DWORD;
end;
{$ALIGN ON}

另一个例子是

  function LookupPrivilegeValue(lpSystemName, lpName: LPCWSTR;
var lpLuid: Int64): BOOL; stdcall; // LUID is treated as Int64

如何安全地将FILETIMELUID等结构直接视为UInt64/Int64?关键是什么?

最佳答案

对于 Delphi 支持的体系结构来说,这基本上不是问题。如果您访问未对齐的数据,x86 和 x64 架构会原谅您。另一方面,访问安腾上未对齐的数据将导致运行时错误。但德尔福从未针对安腾。

重要的问题是记录布局。 Int64 的对齐方式为 8。但是 FILETIME 和 LUID 的对齐方式为 4。这就是为什么 LUID_AND_ATTRIBUTES 被显式标记为 $ALIGN 4。

如果您要将 FILETIME 和 LUID 声明为 Int64,那么每次在记录中包含它们时,您都需要特别注意记录布局。

关于delphi - 将 FILETIME 等结构视为 UInt64/Int64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13487540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com