How to read REG_RESOURCE_LIST in Delphi

I need to read this value from registry

HKEY_LOCAL_MACHINE\HARDWARE\RESOURCEMAP\System Resources\Physical Memory + (.Translated)

Any help appreciated.
Palli
palli011000Asked:
Who is Participating?
 
JaccoCommented:
Hi Palli,

I tested this and it works.

Regards Jacco

procedure TForm1.Button1Click(Sender: TObject);
const
  Val  : String = '.Translated';
var
  Data : Array of Byte;
  S    : String;
  sz   : Word;
  I,Cnt: Word;
  Reg : TRegistry;
  RAM: Int64;
  MB: Integer;
const
  SHFT: array[0..3] of Integer = (0, 8, 16, 24);
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Reg.OpenKey('\HARDWARE\RESOURCEMAP\System Resources\Physical Memory',false) then
  begin
    sz := Reg.GetDataSize(Val);
    if sz > 0 then
      begin
        SetLength(Data, sz);
        Reg.ReadBinaryData(Val, Data[0], sz);
        RAM := 0;
        Cnt := 0;
        for I := sz-4 to sz-1 do
        begin
          RAM := RAM + Data[I] shl SHFT[Cnt];
          Inc(Cnt);
        end;
        MB := Round(RAM / 1024 / 1024 + 16 + 0.5);
        ShowMessage(IntToStr(MB)+' MB');
      end;
  end;
  Reg.Free;
end;
0
 
robert_marquardtCommented:
A TRegistry's ReadBinaryData should do the trick.
The resource is small so a
Buffer: array [0..4096] of Byte; //or whatever the data is
should be enough to hold the data.
0
 
intheCommented:
hi,
just wondering if you know about the GlobalMemoryStatus() api ?
maybe you could use it instead,for instance to show total physical memory you can do:

procedure TForm1.Button1Click(Sender: TObject);
var
PMemStat: ^TMemoryStatus;
begin
New(PMemStat);
GlobalMemoryStatus(PMemStat^);
label1.caption :=
 Format('Physical Memory Available to Windows: %10.0n KB', [pMemstat.dwTotalPhys / 1024]);
Dispose(PMemStat);
end;

   the tmemory structure has
    dwLength;        // sizeof(MEMORYSTATUS)
    dwMemoryLoad;    // percent of memory in use
    dwTotalPhys;     // bytes of physical memory
    dwAvailPhys;     // free physical memory bytes
    dwTotalPageFile; // bytes of paging file
    dwAvailPageFile; // free bytes of paging file
    dwTotalVirtual;  // user bytes of address space
    dwAvailVirtual;  // free user bytes
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
Mohammed NasmanSoftware DeveloperCommented:
Hello

 just add memo1 on the form, and the value will show in it

Uses Registry;

procedure TForm1.Button1Click(Sender: TObject);
const
  Val  : String = '.Translated';
 var
  Data : Array of Byte;
  S    : String;
  sz   : Word;
  I    : Word;
  Reg : TRegistry;
 begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Reg.OpenKey('\HARDWARE\RESOURCEMAP\System Resources\Physical Memory',false) then
  begin
    sz := Reg.GetDataSize(Val);
    if sz > 0 then
      begin
        SetLength(Data, sz);
        Reg.ReadBinaryData(Val, Data[0], sz);
        S := Val + ' = ';
        for I := 0 to sz - 1 do
          S := S + Format('%2x',[Data[I]]);
        Memo1.Text := S;
      end;
  end;
  Reg.Free;
end;

Best regards
Mohammed Nasman
0
 
JaccoCommented:
Here is something I found:

http://www.streichernet.de/nttips/nttip991225-1.htm

Regards Jacco
0
 
palli011000Author Commented:
i need to do this remote inthe, read remote registry
0
 
palli011000Author Commented:
question for Mohammed Nasman:
how can i then tranlate this into i.e.. 128.MB

Palli
0
 
palli011000Author Commented:
i think i need some translation here
0
 
JaccoCommented:
I have found this in a newsgroup.

Regards Jacco

Arthur,

you'll need Win32::TieRegistry and POSIX modules for this....

$nbName is the machine name of the remote computer w/out any slashes.

$RAM returns the amount of RAM in MB.

#####

use Win32::TieRegistry;
use POSIX;



$Registry->Delimiter("/");    



sub PhysRAM {

print "Now checking ram\n";

if ($key = $Registry->Connect
($nbName,"LMachine/Hardware/ResourceMap/System
Resources/Physical Memory/")) {

     $RAM = ceil ((unpack "L*", $key->GetValue('.Translated'))[-1] /
1024
/ 1024 + 16);
print "Done\n";


}


}

0
 
palli011000Author Commented:
i need this for Delphi, sorry
0
 
JaccoCommented:
I thought maybe someone knew how to translate this from perl and POSIX to Delphi...
0
 
JaccoCommented:
I believe unpack converts the bytes to an array of unsigned longs (4 bytes) and the [-1] selects the last entry.

Ceil round up the number.

Now I am not sure how the bytes of the LongInt are stored... MSB LSB (or 16bit MSB LSB). But I'll test tomorrow.

Regards Jacco

So converted to Delphi (using mnasmans sample):

procedure TForm1.Button1Click(Sender: TObject);
const
 Val  : String = '.Translated';
var
 Data : Array of Byte;
 S    : String;
 sz   : Word;
 I    : Word;
 Reg : TRegistry;
 RAM: LongInt;
 MB: Integer;
begin
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY_LOCAL_MACHINE;
 if Reg.OpenKey('\HARDWARE\RESOURCEMAP\System Resources\Physical Memory',false) then
 begin
   sz := Reg.GetDataSize(Val);
   if sz > 0 then
     begin
       SetLength(Data, sz);
       Reg.ReadBinaryData(Val, Data[0], sz);
       // don't know about MSB LSB though
       RAM := 0;
       for I := sz-4 to sz-1 do
         RAM := (RAM shl 8) + Data[I];
       MB := Round(RAM / 1024 / 1024 + 16 + 0.5);
     end;
 end;
 Reg.Free;
end;



0
 
palli011000Author Commented:
thanks, i will wait
0
 
Mohammed NasmanSoftware DeveloperCommented:
Hello

  if you want to read the Physical memorty in windows nt why u don't use GlobalMemoryStatus?

procedure TForm1.Button1Click(Sender: TObject);
var
  MemoryStatus: TMemoryStatus;
begin
  MemoryStatus.dwLength := sizeof(MemoryStatus);
  GlobalMemoryStatus(MemoryStatus);
  Label1.Caption := 'Total Physical Memory: ' +
    FloatToStr(round(MemoryStatus.dwTotalPhys /1024/1024));
end;
0
 
palli011000Author Commented:
yes Jacco this works very fine, how did you solve this anyway?
0
 
palli011000Author Commented:
Is freeware RXLib ready for D6?
0
 
JaccoCommented:
I searched the WEB for a translation of the POSIX & Perl source code which I found at

http://www.mail-archive.com/perl-win32-admin@listserv1.activestate.com/msg00138.html

I only needed translations for:

ceil
unpack
and array index [-1]

Regards Jacco
0
 
palli011000Author Commented:
well done, the points is yours.
Palli
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.