怎样将dword数据转换为tdatetime?(150分)

  • 主题发起人 主题发起人 远帆
  • 开始时间 开始时间

远帆

Unregistered / Unconfirmed
GUEST, unregistred user!
一个Dword类型的数据(C++或asm生成),怎样转换为tdatetime数据?
 
关键是,你的DWORD是怎么取得的?
 
Dword=longInt
Delphi里可以自动转换 Int --> Tdatetime
A : TDatetime;
b : Integer;

b:=3000;
a := b;
DatetimePicker1.Datetime := a;

 
EXE文件中。我只知道是一个dword值。但是我试了几次都不太对。
我用borland's tdump得到的结果好像也不对。
 
tdatetime 是浮点型数值,关键是你的dword是怎样表示的
 
to 寒松 大侠:
还是不对啊?本身tdatetime是一个double类型的,小数部分表明了小时、分。按你的
方法得到的只有年(太大了)、月、日。
 
to chenliang_fly:
是的是的。问题是我也不知道啊。就是EXE文件头中的
pe标志+$8处的4个字节。

typedef struct _IMAGE_FILE_HEADER {
WORD Machine
//该文件运行所需要的CPU,对于Intel平台是14Ch
WORD NumberOfSections
//文件的节数目
DWORD TimeDateStamp
//文件创建日期和时间
DWORD PointerToSymbolTable
//用于调试
DWORD NumberOfSymbols
//符号表中符号个数
WORD SizeOfOptionalHeader
//OptionalHeader 结构大小
WORD Characteristics
//文件信息标记,区分文件是exe还是dll
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER


更具体的就不知道了。
 
如果是标准c函数time()返回的时间 time_t 类型(就是DWORD)
它是距离 1970-1-1 之后的秒数,这样计算为TDateTime
假设你的DWORD时间是 t
那么这样转成TDateTime:
EncodeDate(1970,1,1)+ t/24.0/60.0/60.0
一般来说,c中time()得到的是格林威治时间,要变成本地时间要这样:
var
z:TTimeZoneInformation;
GetTimeZoneInformation(z);
EncodeDate(1970,1,1)+ d/24.0/60.0/60.0 - z.Bias/24.0/60.0;
 
是了,那个时间就是我给的方法算的,要用下面的,计算本地时间的那个(要减去时区的那个)
 
注意这里( _IMAGE_FILE_HEADER )取出的时间是exe编译的时间,不是文件的时间,
文件时间需要用GetFileTime 取得
 
是了,还有,delphi5编译的exe,文件头的时间是不对的,而bcb编译的、以及windows自己带来的
exe的文件头时间是对的
 
哦?PiPi真是高手!
佩服佩服!
给我个QQ吧!我给您提鞋:)
 
不好,我的qq是专门和mm聊天用的,不作其他用途:)
另外,delphi编译的好象差了10年多x天,看看加上一个固定的偏移之后对不对
 
哎,真惨,给人家提鞋,人家都瞧不起:)
问过几次问题,这次是最干净利落的一次。
thanks!
 
接受答案了.
 
后退
顶部