在我阅读了一篇 MSDN 博客文章后出现了问题,为什么不能将 FILETIME 视为 __int64?. 文章说,将 aFILETIME
转换为 an__int64
会产生未对齐的指针。
FILETIME
, LUID
, 和LUID_AND_ATTRIBUTES
Windows 标头中声明的结构如下:
typedef struct FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
}
typedef struct LUID {
ULONG LowPart;
LONG HighPart;
}
typedef struct LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
}
由于FILETIME
and LUID
structs 具有相似的布局,因此将 aLUID
视为 an__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
如何安全地将结构视为FILETIME
或LUID
直接 视为UInt64
/ Int64
?关键是什么?