معرفه تاريخ تنصيب الوندوز
#1
أين الخطأ في هذا الكود

كود :
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;

انه لمعرفه تاريخ تنصيب الوندوز عندما استخدمه يظهر خطأ لماذا؟؟
الرد
#2
السلام عليكم
الخطأ بسبب نوع البيانات ليس 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; 
الرد
#3
(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; 
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم