FileForums

FileForums (https://fileforums.com/index.php)
-   Conversion Tutorials (https://fileforums.com/forumdisplay.php?f=55)
-   -   SysInfo DLL Plugin (https://fileforums.com/showthread.php?t=103432)

Razor12911 29-05-2020 06:27

2 Attachment(s)
I wonder what it is that you're doing wrong bro but here is another place in regedit where you can get GPU info for all GPUs installed.

Cesar82 30-05-2020 05:21

Quote:

Originally Posted by Razor12911 (Post 486085)
I wonder what it is that you're doing wrong bro but here is another place in regedit where you can get GPU info for all GPUs installed.

This subject is also of interest, so I ask questions.
This GUID is variable from system to system.
Here there are 6 GUIDs with DedicatedVideoMemory values, one of which is from the ON-BOARD video card.
But the GUID bears no resemblance to those of your images.
https://i.imgur.com/vXXrx3Z.png
How to identify the correct GUID to obtain the video value?
Would this method work with older operating systems like WindowsXP or Vista, 7, etc?

I could make a list and search all GUIDs until I found a value other than 0, but how do I know if it would be the correct GUID?
The value in DedicatedVideoMemory is not correct here.
It should be 4 GB but it results 4239917056 = 4043.5 MB = 3.94 GB.

Razor12911 30-05-2020 17:23

1 Attachment(s)
Quote:

Originally Posted by Cesar82 (Post 486099)
This subject is also of interest, so I ask questions.
This GUID is variable from system to system.
Here there are 6 GUIDs with DedicatedVideoMemory values, one of which is from the ON-BOARD video card.
But the GUID bears no resemblance to those of your images.
https://i.imgur.com/vXXrx3Z.png
How to identify the correct GUID to obtain the video value?

I decided to check where these values really came from
SOFTWARE\Microsoft\DirectX\ - DirectX is a clue so one has to go on msdn
which is here
https://docs.microsoft.com/en-us/win...i_adapter_desc
https://stackoverflow.com/questions/...r-amd/56599035

Also found this Visual Basic code so I translated it to pascal so here

Code:

uses
  Winapi.Windows, Winapi.DXGI;

type
  TGPUInfo = record
    FName: String;
    FSize: Integer;
  end;

  TGPUs = array of TGPUInfo;

procedure GetGPUs(out V: TGPUs);
  function Align(Value, Size: Integer): Integer;
  begin
    if Value mod Size <> 0 then
      Result := Succ(Max(0, Value div Size)) * Size
    else
      Result := Value;
  end;

var
  GPUInfo: TGPUInfo;
  i: Integer;
  riid: TGUID;
  hr: HRESULT;
  pFactory: IDXGIFactory;
  pAdapter: IDXGIAdapter;
  dxAdapterDesc: DXGI_ADAPTER_DESC;
begin
  riid := StringToGUID('{7b7166ec-21c7-44ae-b21a-c9ae321ae369}');
  pFactory := nil;
  hr := CreateDXGIFactory(riid, pFactory);
  if (hr = S_OK) and Assigned(pFactory) then
  begin
    pAdapter := nil;
    i := 0;
    while (pFactory.EnumAdapters(i, pAdapter) = S_OK) do
    begin
      FillChar(dxAdapterDesc, SizeOf(DXGI_ADAPTER_DESC), 0);
      hr := pAdapter.GetDesc(dxAdapterDesc);
      if hr = S_OK then
      begin
        GPUInfo.FName := dxAdapterDesc.Description;
        GPUInfo.FSize := IfThen(dxAdapterDesc.DedicatedVideoMemory = 0,
          dxAdapterDesc.DedicatedSystemMemory,
          dxAdapterDesc.DedicatedVideoMemory) div 1048576;
        GPUInfo.FSize := Align(GPUInfo.FSize, IfThen(GPUInfo.FSize < 512,
          32, 512));
        Insert(GPUInfo, V, Length(V));
      end;
      inc(i);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  MyGPUs: TGPUs;
begin
  GetGPUs(MyGPUs);
  for i := Low(MyGPUs) to High(MyGPUs) do
    ShowMessage(MyGPUs[i].FName + ' (' + MyGPUs[i].FSize.ToString + ' MB)');
end;

Quote:

Would this method work with older operating systems like WindowsXP or Vista, 7, etc?
This works using DXGI which was introduced in Windows Vista.

Quote:

The value in DedicatedVideoMemory is not correct here.
It should be 4 GB but it results 4239917056 = 4043.5 MB = 3.94 GB.
Actually it is correct, open task manager and you'll see why it is 3.94 GB, I added the align function to help with rounding off 4044 to 4096

Cesar82 30-05-2020 18:44

@Razor12911
If possible, share the compiled executable for me to check here.

I changed the code to use with Delphi 2010 (I only have this version installed), but in the Delphi 2010 version it does not have uses DXGI, so I include this DXGI from the link

The results here were well below what should be displayed (3584 MB).And in the second result he detected "Microsoft Basic Render Driver (0 MB)"

I don't know if I did something wrong or the DXGI I used doesn't work, so if possible share the exe for me to compare.
Thanks!

Razor12911 30-05-2020 18:51

2 Attachment(s)
there

edit: something I'm only realizing now XD, this method might have issues because it is SIZE_T that is being used which is an equivalent to NativeInt in Delphi.

NativeInt in x86 is actually a 32-bit integer, however this can be fixed by merging this code to the same idea I shared earlier about the same info being available on registry here

Cesar82 30-05-2020 19:09

You have correctly displayed the value of the main video card.
https://i.imgur.com/RsCj6ED.png
Did not detect Intel (R) HD Graphics 4000
https://i.imgur.com/p8fz5yS.png

Did something go wrong with my adaptation?
Or maybe the DXGI I used doesn't work for that.
Code:

uses
  Windows, DXGI;
  //DXGI from link

type
  TGPUInfo = record
    FName: String;
    FSize: Integer;
  end;

  TGPUs = array of TGPUInfo;

procedure GetGPUs(out V: TGPUs);
  function Max(A, B: Integer): Integer;
  begin
    if A > B then
      Result := A
    else
      Result := B;
  end;
  function Align(Value, Size: Integer): Integer;
  begin
    if Value <> 0 then
      Result := (Max(0, Value div Size) + 1) * Size
    else
      Result := Value;
  end;
var
  GPUInfo: TGPUInfo;
  i: Integer;
  riid: TGUID;
  hr: HRESULT;
  pFactory: IDXGIFactory;
  pAdapter: IDXGIAdapter;
  dxAdapterDesc: TDXGI_ADAPTER_DESC;
begin
  riid := StringToGUID('{7b7166ec-21c7-44ae-b21a-c9ae321ae369}');
  pFactory := nil;
  hr := CreateDXGIFactory(riid, pFactory);
  if (hr = S_OK) and Assigned(pFactory) then
  begin
    pAdapter := nil;
    i := 0;
    while (pFactory.EnumAdapters(i, pAdapter) = S_OK) do
    begin
      FillChar(dxAdapterDesc, SizeOf(TDXGI_ADAPTER_DESC), 0);
      hr := pAdapter.GetDesc(dxAdapterDesc);
      if hr = S_OK then
      begin
        GPUInfo.FName := dxAdapterDesc.Description;

        if dxAdapterDesc.DedicatedVideoMemory = 0 then
          GPUInfo.FSize := dxAdapterDesc.DedicatedSystemMemory div 1048576
        else
          GPUInfo.FSize := dxAdapterDesc.DedicatedVideoMemory div 1048576;

        if GPUInfo.FSize < 512 then
          GPUInfo.FSize := Align(GPUInfo.FSize, 32)
        else
          GPUInfo.FSize := Align(GPUInfo.FSize, 512);

        SetLength(V, Length(V) + 1);
        V[Length(V) - 1] := GPUInfo;
      end;
      Inc(i);
    end;
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  MyGPUs: TGPUs;
begin
  GetGPUs(MyGPUs);
  for i := Low(MyGPUs) to High(MyGPUs) do
    ShowMessage(MyGPUs[i].FName + ' (' + IntToStr(MyGPUs[i].FSize) + ' MB)');
end;


felice2011 31-05-2020 03:26

I don't understand the basics are here https://docs.microsoft.com/en-us/win...ideocontroller in the WMI class, because used DX structures, also I think that only the primary vga that is used is of interest.

Code:

        Name_GPU.Text = "GPU Name : " & GPU_Name()
        Ram_Adapter.Text = "VGA Memory : " & Format_Bytes(AdapterRAM)

...

    Private Function GPU_Name() As String
        'Info GPU
        Dim Name_GPU As String = ""
        Dim GPU As New ManagementObjectSearcher("SELECT Name FROM Win32_VideoController")
        For Each Info_GPU As ManagementObject In GPU.Get()
            Try
                Name_GPU = Info_GPU("Name").ToString()
                Exit For
            Catch ex As Exception
                Name_GPU = "?"
            End Try
        Next
        Return Name_GPU
    End Function

    Private Function AdapterRAM() As String
        'Info GPU
        Dim Adapter_RAM As String = ""
        Dim GPU As New ManagementObjectSearcher("SELECT AdapterRAM FROM Win32_VideoController")
        For Each Info_GPU As ManagementObject In GPU.Get()
            Try
                Adapter_RAM = Info_GPU("AdapterRAM").ToString()
                Exit For
            Catch ex As Exception
                Adapter_RAM = "?"
            End Try
        Next
        Return Adapter_RAM
    End Function

    Private Function Format_Bytes(ByVal Bytes_Convert As String) As String
        Dim Total_Convert As Double
        Try
            Select Case Bytes_Convert
                'Case Is >= 1073741824 'GB
                '    Total_Convert = CDbl(Bytes_Convert / 1073741824) 'GB
                '    Return FormatNumber(Total_Convert, 2) & " GBytes"
                Case Is >= 1048576 'To 1073741823
                    Total_Convert = CDbl(Bytes_Convert / 1048576) 'MB
                    Return FormatNumber(Total_Convert, 0) & " MBytes"
                Case 1024 To 1048575
                    Total_Convert = CDbl(Bytes_Convert / 1024) 'KB
                    Return FormatNumber(Total_Convert, 0) & " KBytes"
                Case 0 To 1023
                    Total_Convert = Bytes_Convert 'Bytes
                    Return FormatNumber(Total_Convert, 0) & " Bytes"
                Case Else
                    Return ""
            End Select
        Catch
            Return ""
        End Try
    End Function


Cesar82 31-05-2020 05:48

Quote:

Originally Posted by felice2011 (Post 486123)
I don't understand the basics are here https://docs.microsoft.com/en-us/win...ideocontroller in the WMI class, because used DX structures, also I think that only the primary vga that is used is of interest.

WMI class ( AdapterRAM ) does not support video cards over 4 GB.
Only for that reason the matter continues.

Razor12911 31-05-2020 06:02

2 Attachment(s)
try this one, you can remove the DXGI code if you having issues and just use the registry. Should produce the same results.

Code:

uses
Winapi.Windows, Winapi.DXGI, System.Win.Registry;

type
  TGPUInfo = record
    FName: String;
    FSize: Integer;
  end;

  TGPUs = array of TGPUInfo;

procedure GetGPUs(out V: TGPUs; UseDXGI: Boolean);
  function Align(Value, Size: Integer): Integer;
  begin
    if Value mod Size <> 0 then
      Result := Succ(Max(0, Value div Size)) * Size
    else
      Result := Value;
  end;

const
  RegPath = 'SOFTWARE\Microsoft\DirectX\';
var
  GPUInfo: TGPUInfo;
  i, j, k, l: Integer;
  x: Int64;
  riid: TGUID;
  hr: HRESULT;
  pFactory: IDXGIFactory;
  pAdapter: IDXGIAdapter;
  dxAdapterDesc: DXGI_ADAPTER_DESC;
  Reg1: TRegIniFile;
  Reg2: TRegistry;
  SL: TStringList;
  mybool: Boolean;
begin
  Reg1 := TRegIniFile.Create(KEY_READ or KEY_WOW64_64KEY);
  SL := TStringList.Create;
  Reg1.RootKey := HKEY_LOCAL_MACHINE;
  if Reg1.OpenKey(RegPath, False) then
    Reg1.ReadSections(SL);
  Reg1.Free;
  Reg2 := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
  Reg2.RootKey := HKEY_LOCAL_MACHINE;
  if UseDXGI then
  begin
    riid := StringToGUID('{7b7166ec-21c7-44ae-b21a-c9ae321ae369}');
    pFactory := nil;
    hr := CreateDXGIFactory(riid, pFactory);
    if (hr = S_OK) and Assigned(pFactory) then
    begin
      pAdapter := nil;
      i := 0;
      while (pFactory.EnumAdapters(i, pAdapter) = S_OK) do
      begin
        FillChar(dxAdapterDesc, SizeOf(DXGI_ADAPTER_DESC), 0);
        hr := pAdapter.GetDesc(dxAdapterDesc);
        if hr = S_OK then
        begin
          GPUInfo.FName := dxAdapterDesc.Description;
          GPUInfo.FSize := IfThen(dxAdapterDesc.DedicatedVideoMemory = 0,
            dxAdapterDesc.DedicatedSystemMemory,
            dxAdapterDesc.DedicatedVideoMemory) shr 20;
          if dxAdapterDesc.DedicatedSystemMemory = 0 then
            for j := 0 to SL.Count - 1 do
            begin
              if Reg2.OpenKey(RegPath + SL[j], False) then
              begin
                if (Reg2.ReadString('Description') = GPUInfo.FName) then
                  if Reg2.ReadBinaryData('DedicatedVideoMemory', x, x.Size) = x.Size
                  then
                  begin
                    GPUInfo.FSize := x shr 20;
                    break;
                  end;
                Reg2.CloseKey;
              end;
            end;
          GPUInfo.FSize := Align(GPUInfo.FSize, IfThen(GPUInfo.FSize < 512,
            32, 512));
          Insert(GPUInfo, V, Length(V));
        end;
        inc(i);
      end;
    end;
  end;
  for j := 0 to SL.Count - 1 do
  begin
    if Reg2.OpenKey(RegPath + SL[j], False) then
    begin
      mybool := True;
      for i := Low(V) to High(V) do
      begin
        if (Reg2.ReadString('Description') = V[i].FName) then
        begin
          mybool := False;
          break;
        end;
      end;
      if mybool then
      begin
        GPUInfo.FName := Reg2.ReadString('Description');
        x := 0;
        if Reg2.ReadBinaryData('DedicatedVideoMemory', x, x.Size) = x.Size then
          x := x shr 20;
        if x = 0 then
          if Reg2.ReadBinaryData('DedicatedSystemMemory', x, x.Size) = x.Size
          then
            x := x shr 20;
        GPUInfo.FSize := x;
        GPUInfo.FSize := Align(GPUInfo.FSize, IfThen(GPUInfo.FSize < 512,
          32, 512));
        Insert(GPUInfo, V, Length(V));
      end;
    end;
    Reg2.CloseKey;
  end;
  SL.Free;
  Reg2.Free;
  for i := Low(V) to High(V) do
  begin
    k := 0;
    for j := Low(V) to High(V) do
      if V[j].FSize >= k then
      begin
        k := V[i].FSize;
        l := j
      end;
    GPUInfo := V[i];
    V[i] := V[l];
    V[l] := GPUInfo;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  MyGPUs: TGPUs;
begin
  Memo1.Lines.Clear;
  GetGPUs(MyGPUs, True);
  for i := Low(MyGPUs) to High(MyGPUs) do
    Memo1.Lines.Add(MyGPUs[i].FName + ' (' + MyGPUs[i].FSize.ToString + ' MB)');
end;


Cesar82 31-05-2020 20:33

1 Attachment(s)
Thanks @Razor12911

I just didn't understand one thing ...
In your code above, the registration information overlaps the GDXI values (if parametter UseDXGI = true).
Shouldn't there be an "end else" in place of "end;"?
Code:

        inc(i);
      end;
    end;
  end else
    for j := 0 to SL.Count - 1 do
    begin

If someone using older versions of Delphi, I attached the example of Razor12911 adapted for Delphi 2010.
Thanks again Razor12911 for the code, it's working perfectly, especially the version using registry that also detects the ON-BOARD video card.

Razor12911 01-06-2020 01:06

I made it to work like that for a reason. Remember you said your intel you was not detected. So after dxgi is done detecting gpus using its methods, if any gpus were missed then registry code adds the remaining gpus. This is why I didn’t use “else”.
But then you might say why not just get rid of dxgi if doesn’t detect all gpus.

Here is why, registry skips gpus with names that have already been detected which means if SLi/Crossfire was used, registry method will not be able to detect this but dxgi will be able to.
While dxgi has issues of detecting intel gpu, registry helps dxgi
Plus we have no idea if the same registry idea works on older operating systems so it’s best to have both methods working together

So you can see why both code have to exist because they nullify the disadvantages they both have, furthermore. Dxgi has issues detecting gpu size in x86 because the value type used in x86 has the same issue as with wmi adapterram where gpu over 4gb is misread.

Tl;dr both code help mitigate their own disadvantages so the code works flawlessly

Cesar82 01-06-2020 08:04

@Razor12911
Now I understand. Thanks!
There will only be differences in the results checking or not DXGI if you use SLI/Crossfire.

BLACKFIRE69 07-06-2020 06:05

SysInfo Library 2
 
2 Attachment(s)
SysInfo Library 2


Added:
  • CheckIsAdmin
  • CheckIs64Bit
  • GetOSVersionMajor
  • GetOSVersionMinor
  • GetServicePackMajorVersion
  • GetServicePackMinorVersion
  • DirectX Version
  • SoundCardName


Thanks Cesar82, Razor12911 ... who helped.

Cesar82 07-06-2020 09:19

1 Attachment(s)
Quote:

Originally Posted by BLACKFIRE69 (Post 486210)
SysInfo Library 2
Added:
  • CheckIsAdmin
  • CheckIs64Bit
  • GetOSVersionMajor
  • GetOSVersionMinor
  • GetServicePackMajorVersion
  • GetServicePackMinorVersion
  • DirectX Version
  • SoundCardName

Thanks Cesar82, Razor12911 ... who helped.

Thanks @BLACKFIRE69!
It seems to be working perfectly.

For those who have Inno Setup 6 installed and do not have the knowledge to change the script and want to do the test, I attached to this post the script adapted for Inno Setup 6.0 or newer.

bunti_o4u 07-06-2020 23:20

Quote:

Originally Posted by BLACKFIRE69 (Post 486210)
SysInfo Library 2

Added:
  • DirectX Version

retrieving directX version makes the setup to take more time then if directX is not added in script. pl look into it.

BLACKFIRE69 08-06-2020 00:48

Quote:

Originally Posted by bunti_o4u (Post 486221)
retrieving directX version makes the setup to take more time then if directX is not added in script. pl look into it.

got it... 👍

bunti_o4u 08-06-2020 01:48

1 Attachment(s)
Quote:

Originally Posted by BLACKFIRE69 (Post 486222)
got it... 👍

Soundcard is Realtek high definition audio but it is showing Nvidia high definition audio.

DiCaPrIo 08-06-2020 02:06

Quote:

Originally Posted by bunti_o4u (Post 486224)
Soundcard is Realtek high definition audio but it is showing Nvidia high definition audio.

did you plugin your woofer or earphone

bunti_o4u 08-06-2020 02:25

1 Attachment(s)
Quote:

Originally Posted by DiCaPrIo (Post 486225)
did you plugin your woofer or earphone

Headphones are always plugged in and working properly.

DiCaPrIo 08-06-2020 03:06

1 Attachment(s)
Quote:

Originally Posted by bunti_o4u (Post 486227)
Headphones are always plugged in.

test your headphones if its really working
as I have same problem whenever I unplugin my earphone it shows

KaktoR 08-06-2020 09:33

1 Attachment(s)
Works fine here :p

Harsh ojha 09-06-2020 05:19

1 Attachment(s)
Perfect
(Low End Pc)

bundy-al 17-03-2021 09:45

Hi is there anyone here on the forum that WILL help me.
I have asked 3 people but no one wants to help.
Who can change the script from Project1 or SysInfo DLL 2 and make it into a batch script ?

Project1 you have to click on a button first to read the GPU Memory, I want the GPU Memory to be read and saved on the desktop as .txt and the script preferably as a batch file.

SysInfo DLL 2 also looks good, but only read out and save as .txt with a batch script.
Now it's a setup and you have to click Next, I don't want to see a fixed screen at all.


This would also be nice in a batch file.

Detecting Graphics Adapter Data

Basic Graphics Information

Adapter 1 Description : NVidia RTX 2070 Super
Adapter 1 Video Memory : 8.00 GB [Rounded Value].
Adapter 1 Driver Date : 2021-02-23
Adapter 1 Driver Version : 27.21.14.6172
Adapter 1 Bits Per Pixel : 32
Adapter 1 Video Mode Desc : 1920 x 1080 x 4294967296 colors

Adapter 2 Intel(R) HD Graphics 4600 (128 MB)
Adapter 2 Video Memory : 128 MB [Rounded Value]
Adapter 2 Driver Date : 2021-02-23
Adapter 2 Driver Version : 27.21.14.6172
Adapter 2 Bits Per Pixel : 32
Adapter 2 Video Mode Desc : 1920 x 1080 x 4294967296 colors

And if that's not possible, then just this,

Adapter 1 Description : NVidia RTX 2070 Super
Adapter 1 Video Memory : 8.00 GB [Rounded Value]
Adapter 2 Intel(R) HD Graphics 4600 (128 MB)
Adapter 2 Video Memory : 128 MB [Rounded Value]

Display this script with read in and then save it to the desktop as a .txt

Please message back if you are willing and able to make this batch script for me please, if you have the time.
Then you are the best for me.

Best regards

Lord.Freddy 03-09-2022 23:40

Problem
 
2 Attachment(s)
1) Your dll was very good, but in the [ANSI] version, (Free Space) and (Total Space), it shows the disk size incorrectly.

2) Not working on windowsXP (X86)/(X64)


All times are GMT -7. The time now is 06:46.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.
FileForums @ https://fileforums.com