【问题标题】:Delphi: add constant to TFileTimeDelphi:将常量添加到 TFileTime
【发布时间】:2014-12-15 12:49:42
【问题描述】:

我是 Delphi 的新手,我需要在我的项目中添加一些常量到 TFileTime,它是 64 位值的上下部分的记录。如何在德尔福中做到这一点?我只找到了 C++ 中的代码,但我不知道如何在 Delphi 中制作 unsigned int64 (ULONGLONG),也不知道如何将其转换为 longword (DWORD):

ULONGLONG qwResult;

// Copy the time into a quadword.
qwResult = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime;

// Add constant
qwResult += constant;

// Copy the result back into the FILETIME structure.
ft.dwLowDateTime  = (DWORD) (qwResult & 0xFFFFFFFF );
ft.dwHighDateTime = (DWORD) (qwResult >> 32 );

谢谢

【问题讨论】:

  • const MyFileTime: TFileTime = (dwLowDateTime: 123; dwHighDateTime: 456);
  • 我得到了存在的 ft 值,我只需要给它添加一些常量。
  • 您使用的是哪个版本的 Delphi?特别是,您的 Delphi 版本是否具有 Int64 和/或 UInt64 类型?
  • OK UInt64 解决了一半的问题... :)
  • @hvd,UInt64 的存在并不重要,因为FILETIME 的有效范围是0..High(Int64)

标签: delphi casting unsigned int64


【解决方案1】:

FILETIME 结构定义为:

typedef struct _FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *PFILETIME;

因此,由于 Windows 运行在 little Endian 上,因此该结构的布局与 64 位整数值兼容。

因此,您可以将TFileTime 转换为UInt64,进行算术运算,然后再转换回去。像这样:

function IncrementedFileTime(const Value: TFileTime; const Incr: UInt64): TFileTime;
begin
  Result := TFileTime(UInt64(Value) + Incr);
end;

现在,FILETIME 记录的文档说:

不建议您从 FILETIME 结构获取相对时间。相反,您应该复制 文件时间的低位和高位部分到 ULARGE_INTEGER 结构,对 QuadPart 成员执行 64 位运算,然后复制 将 LowPart 和 HighPart 成员放入 FILETIME 结构中。

不要将指向 FILETIME 结构的指针转换为 ULARGE_INTEGER* 或 __int64* 值,因为它会导致对齐 64 位 Windows 上的故障。

这是对齐错误导致硬故障的目标的问题。例如安腾。但是,在 x86 和 x64 上,我的答案中的代码很好,因为这些架构不会针对对齐错误发出硬故障。这也很好,因为 Delphi 编译器不擅长对齐。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2014-10-16
    相关资源
    最近更新 更多