Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RAM Bänke auslesen (https://www.delphipraxis.net/79883-ram-baenke-auslesen.html)

dbdeath74 30. Okt 2006 13:08


RAM Bänke auslesen
 
Hallo,

hat jemand eine Idee wie man an die Belegung der Ram Bänke rankommen könnte?
Also belegt/nicht belegt usw.

Ich hab mir schon die Finger wund gegooglet, konnte aber leider bisher nichts entsprechendes entdecken :(

Gruß Oliver

MagicAndre1981 30. Okt 2006 13:24

Re: RAM Bänke auslesen
 
Ich glaub über DMI geht das :gruebel:

dbdeath74 30. Okt 2006 14:20

Re: RAM Bänke auslesen
 
Hallo,

durch etwas googlen bin ich auch zu dem Schluss gekommen das es mit DMI (Desktop Management Interface) gehen müsste.
Nur leider konnte ich bisher keine Code Schnippsel oder ähnliches entdecken wie ich DMI mit Delphi nutzen kann.

Hält sich jeder Hersteller überhaupt daran? Oder kann das wieder von Hersteller zu Hersteller unterschiedlich sein?

Gruß Oliver

dbdeath74 30. Okt 2006 15:25

Re: RAM Bänke auslesen
 
Ich nehme gerne auch kostenpflichtige Komponenten die mir solche Hardwarenahen Infos zur Verfügung stellen :)

Falls jemand so etwas kennt.

Gruß Oliver

dbdeath74 15. Nov 2006 10:21

Re: RAM Bänke auslesen
 
Hallo,

*thread wieder nach oben zerr* :D

Ich habe jetzt eine Möglichkeit gefunden mit wmi die auch unter w2k funktioniert.
Seltsamerweise hatte der wmi browser den ich hatte mir bisher kein Ergebniss für die Klasse WIN32_PhysicalMemory zurückgeliefert.

Dieser Beispiel hier funktioniert aber trotzdem (falls noch jemand so etwas sucht):
http://www.planet-source-code.com/vb...d=628&lngWId=7

Was ich an dem Code allerdings nicht verstehe sind die letzten 2 Querys der Procedure.
Warum macht er die? Das gewünschte Ergebniss wird ja vorher schon zurückgeliefert? Vielleicht kann mir das jemand erklären :)

Gruß Oliver

Delphi-Quellcode:
Procedure TForm1.GetMemBanks();
var
// Objektreferenzen auf WMI
   Services:  ISWbemServices;
   ObjectSet: ISWbemObjectSet;
   SObject:   ISWbemObject;
   propSet :  ISWbemPropertySet;
   SProp:     ISWbemProperty;
   propEnum,
   Enum:      IEnumVariant;
   tempObj:   OleVariant;
   Count,
   Value:     Cardinal;
   ListItem:  TListItem;
   strValue:    String;
   Column:    TListColumn;
   strQuery:  WideString;
// Zähler für die Anzahl der Bänke
   intBanks: Integer;

begin
   // Initialisieren
   intBanks := 1;
   // sicherstellen, dass alle Anforderungen beendet wurden
   SinkClasses.Cancel;
   // mit Namespace verbinden
   Services := Locator.ConnectServer('', 'root\CIMV2', '', '', '', '', 0, nil);
   // Abfrage starten
   ObjectSet := Services.ExecQuery('SELECT Capacity FROM Win32_PhysicalMemory', 'WQL', wbemFlagReturnImmediately, nil);
   // Enumeration übernehmen
   Enum := (ObjectSet._NewEnum) as IEnumVariant;
   // alle Einträge durchgehen
   while (Enum.Next(1, tempObj, Value) = S_OK) do
    begin
      SObject := IUnknown(tempObj) as SWBemObject;
      propSet := SObject.Properties_;
      propEnum := (propSet._NewEnum) as IEnumVariant;
      while (propEnum.Next(1, tempObj, Value) = S_OK) do
      begin
        SProp := IUnknown(tempObj) as SWBemProperty;
        strValue := '';
        if VarIsNull(SProp.Get_Value) then
          strValue := '<empty>'
        else
        case SProp.CIMType of
          wbemCimtypeSint8, wbemCimtypeUint8, wbemCimtypeSint16, wbemCimtypeUint16,
          wbemCimtypeSint32, wbemCimtypeUint32, wbemCimtypeSint64:
          if VarIsArray(SProp.Get_Value) then
          begin
            if VarArrayHighBound(SProp.Get_Value, 1) > 0 then
              for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do
                strValue := strValue + ' ' + IntToStr(SProp.Get_Value[Count]);
          end
          else
            strValue := IntToStr(SProp.Get_Value);
          wbemCimtypeReal32, wbemCimtypeReal64:
            strValue := FloatToStr(SProp.Get_Value);
          wbemCimtypeBoolean:
            if SProp.Get_Value then
              strValue := 'True'
            else
              strValue := 'False';
          wbemCimtypeString, wbemCimtypeUint64:
          if VarIsArray(SProp.Get_Value) then
          begin
            if VarArrayHighBound(SProp.Get_Value, 1) > 0 then
              for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do
                strValue := strValue + ' ' + SProp.Get_Value[Count];
          end
          else
            strValue := SProp.Get_Value;
          wbemCimtypeDatetime:
            strValue := SProp.Get_Value;
          wbemCimtypeReference:
          begin
            strValue := SProp.Get_Value;
            // entfernt....
          end;
          wbemCimtypeChar16:
            strValue := '<16-bit character>';
          wbemCimtypeObject:
            strValue := '<CIM Object>';
        else
          ShowMessage('Unknown type');
        end; {case}

        if sProp.Name = 'Capacity' then
        begin
          Memo1.Lines.Add('MemBank' + IntToStr(intBanks) + ': ' + strValue);
          intBanks := intBanks +1;
        end;
      end; {while propEnum}
    end; {while Enum}

    strQuery := 'SELECT * FROM __InstanceCreationEvent within 5 WHERE TargetInstance' +
      ' ISA "' + 'Win32_PhysicalMemory' + '"';
    Services.ExecNotificationQueryAsync(SinkClasses.DefaultInterface, strQuery, 'WQL', 0, nil, nil);
      strQuery := 'SELECT * FROM __InstanceDeletionEvent within 5 WHERE TargetInstance' +
      ' ISA "' + 'Win32_PhysicalMemory' + '"';
    Services.ExecNotificationQueryAsync(SinkClasses.DefaultInterface, strQuery, 'WQL', 0, nil, nil);
end;

himitsu 21. Nov 2006 18:55

Re: RAM Bänke auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal dein Beispiel versucht umzusetzen und konnte dennoch nichts sehen.

Und meine eigene WMI-Klasse zeigt uch keine Werte zu Win32_PhysicalMemory an.
Es wird zwar zu Win32_PhysicalMemory verwunden (da keine Verbingungsfehler auftritt), aber es scheint keine Instanzen zu geben.

In dem angehängten Programm ist dein Code von oben drin,
nur Locator := TSWbemLocator.Create(nil); wurde eingefügt (so wie ich es in meine Klasse verwende und soweit ich das sehe ist der restliche Code ähnlich Meinem)



Die letzen Abfragen gehören nicht zur RAM-Bank-Erkennung ... die gehören wohl zur Abschluß-Bestätigung (oder sowas) von SinkClasses.Cancel; am Anfang


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz