小弟用C++写了个程序获取系统最近一次关机时间,读取了注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows的ShutdownTime的值。虽然可以正确的读取,但是读出来的内容是一个byte类型的8个字节的值,一直没找到如何把这个值变为可读形式的函数。我知道一种转换方式如下:
time_t tLastTime;
tLastTime= time(NULL);
struct tm * tblock = localtime(&tLastTime);
然后就可以使用tblock了。但是如何正确的把那8个字节转换为64位的time_t值,我却不知道该怎么办了。不知道哪位大哥能帮帮小弟。谢谢啦。下面是我在网上找到的C#和VB对这个问题的解决方式,但是C++版的一直没找到...T_T
C#
public static DateTime GetLastSystemShutdown()
{
string sKey = @"System\CurrentControlSet\Control\Windows";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey);
string sValueName = "ShutdownTime";
byte[] val = (byte[])key.GetValue(sValueName);
long valueAsLong = BitConverter.ToInt64(val, 0);
return DateTime.FromFileTime(valueAsLong);
}
VBS
strValueName = "HKLM\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime"
Set oShell = CreateObject("WScript.Shell")
Ar = oShell.RegRead(strValueName)
Term = Ar(7)*(2^56) + Ar(6)*(2^48) + Ar(5)*(2^40) + Ar(4)*(2^32) + Ar(3)*(2^24) + Ar(2)*(2^16) + Ar(1)*(2^8) + Ar(0)
Days = Term/(1E7*86400)
'北京时区GMT+8
Days = Days+8/24
PP = CDate(DateSerial(1601, 1, 1) + Days)
time_t tLastTime;
tLastTime= time(NULL);
struct tm * tblock = localtime(&tLastTime);
然后就可以使用tblock了。但是如何正确的把那8个字节转换为64位的time_t值,我却不知道该怎么办了。不知道哪位大哥能帮帮小弟。谢谢啦。下面是我在网上找到的C#和VB对这个问题的解决方式,但是C++版的一直没找到...T_T
C#
public static DateTime GetLastSystemShutdown()
{
string sKey = @"System\CurrentControlSet\Control\Windows";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey);
string sValueName = "ShutdownTime";
byte[] val = (byte[])key.GetValue(sValueName);
long valueAsLong = BitConverter.ToInt64(val, 0);
return DateTime.FromFileTime(valueAsLong);
}
VBS
strValueName = "HKLM\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime"
Set oShell = CreateObject("WScript.Shell")
Ar = oShell.RegRead(strValueName)
Term = Ar(7)*(2^56) + Ar(6)*(2^48) + Ar(5)*(2^40) + Ar(4)*(2^32) + Ar(3)*(2^24) + Ar(2)*(2^16) + Ar(1)*(2^8) + Ar(0)
Days = Term/(1E7*86400)
'北京时区GMT+8
Days = Days+8/24
PP = CDate(DateSerial(1601, 1, 1) + Days)
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货