Câu hỏi nảy sinh sau khi tôi đọc một bài viết trên MSDN Blog, Why can't you treat a FILETIME as an __int64?. Bài viết nói rằng việc đúc một số FILETIME
đến một số __int64
có thể tạo một con trỏ không được căn chỉnh.Xử lý các cấu trúc như FILETIME dưới dạng UInt64/Int64
FILETIME
, LUID
, và LUID_AND_ATTRIBUTES
struct tuyên bố trong Windows tiêu đề như sau:
typedef struct FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
}
typedef struct LUID {
ULONG LowPart;
LONG HighPart;
}
typedef struct LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
}
Kể từ FILETIME
và LUID
cấu trúc có một bố cục tương tự, do đó điều trị một LUID
như một __int64
cũng có thể tạo ra một con trỏ lệch. Tuy nhiên, Windows.pas
(Delphi XE3 đây) thực hành này--, ví dụ:
{$ALIGN 4}
LUID_AND_ATTRIBUTES = record
Luid : Int64; // Here, LUID is treated as Int64
Attributes: DWORD;
end;
{$ALIGN ON}
ví dụ khác là
function LookupPrivilegeValue(lpSystemName, lpName: LPCWSTR;
var lpLuid: Int64): BOOL; stdcall; // LUID is treated as Int64
Làm thế nào để điều trị một cách an toàn cấu trúc như FILETIME
hoặc LUID
trực tiếp như UInt64
/Int64
? Chìa khóa là gì?
@David_Heffernan, giải thích rất rõ, cảm ơn. – Astaroth