delphi4arab منتديات دلفي للعرب
معرفه تاريخ تنصيب الوندوز - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : معرفه تاريخ تنصيب الوندوز (/showthread.php?tid=2286)



معرفه تاريخ تنصيب الوندوز - خدم الحسين - 09-08-2010

أين الخطأ في هذا الكود

كود :
function getinstalldate: String; var di: Longint; buf: Array [ 0..3 ] of byte; begin result := 'unknown'; with tregistry.create do begin rootkey := hkey_local_machine; lazywrite := true; openkey ( '\software\microsoft\windows nt\currentversion', false ); di := readbinarydata ( 'installdate', buf, sizeof ( buf ) ); // result := datetimetostr ( filedatetodatetime ( buf [ 0 ] + buf [ 1 ] * 256 + buf [ 2 ] * 65535 + buf [ 3 ] * 16777216 ) ); showmessage(inttostr(di)); free; end; end;

انه لمعرفه تاريخ تنصيب الوندوز عندما استخدمه يظهر خطأ لماذا؟؟


معرفه تاريخ تنصيب الوندوز - kachwahed - 10-08-2010

السلام عليكم
الخطأ بسبب نوع البيانات ليس 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; 



RE: معرفه تاريخ تنصيب الوندوز - justnick - 23-06-2018

(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;