23-06-2018, 06:10 PM
(10-08-2010, 04:46 PM)kachwahed كتب : السلام عليكم
الخطأ بسبب نوع البيانات ليس Binary وإنما DWORD يمكن قراءته بـ ReadInteger
PHP كود :uses
Registry, DateUtils;
Function GetWindowsInstallDate: String;
var
Reg : TRegistry;
StartDate : TDateTime;
ThePC : String;
begin
Reg := TRegistry.Create();
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.RegistryConnect(ThePC) then
begin
REG.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False);
StartDate := EncodeDateTime(1970,1,1,0,0,0,0);
Result := DateToStr(IncSecond(StartDate,Reg.ReadInteger('InstallDate')));
Reg.CloseKey;
end;
finally
FreeAndNil(Reg);
end;
end;
السلام عليكم ورحمة الله وبركاته
عند تجربتى لهذا الكود لم يعمل بشكل صحيح وذلك لان الوندوز لدى 64bit وانا ابرمج برنامج 32bit
فالويندوز يعيد القيمة صفر لمفتاح الرجيسترى المسؤل عن تاريخ تثبيت الوندوز
بالبحث توصلت الى flag لابد من استخدامه عند استعلام عن قيم 64 بت من برنامج 32 وهى
KEY_WOW64_64KEY
ليكون الكود بالشكل التالى
PHP كود :
var
myReg : TRegistry;
myResult : DWORD;
begin
{KEY_WOW64_64KEY enable 32-bit applications to access redirected keys in the
64-bit registry view }
myReg := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
try
//Registry root key
myReg.RootKey := HKEY_LOCAL_MACHINE;
//open the key
myReg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False);
//target value returned as integer
myResult := myReg.ReadInteger('InstallDate');
//convert unix time to datetime
ShowMessage('Windows was installed in :' + DateTimeToStr(UnixToDateTime(myResult)));
finally
myReg.Free;
end;
end;

