Entwickler-Ecke

Windows API - Hardware auslesen


Interruptor - So 29.06.03 21:47
Titel: Hardware auslesen
Hallo!

Ich bin dabei ein Programm für meine Firma zu schreiben, welches mir für die Inventur alle Geräte aus meinem PC ausliest. Ich hab soweit eigentlich alles. Nur müsste ich noch die Geräte auslesen können. Also die pci und agp geräte!

Kann mir jemand einen Tip geben wie ich das am besten mache?

über regestry weis ich leider nicht wie und wo ich das suchen muss!!

Gruß

Interruptor :lol:


Delete - So 29.06.03 21:54

Über die Registry. Da mußt du wohl in den sauren Apfel beißen und mal eine halbe Stunde für die Suche investieren.


Interruptor - Mo 30.06.03 07:10

Hm!

Kann mir dann vieleicht jemand es in soweit erleichtern und mir sagen ob ich es aus der Software oder aus dem Bus auslesen muss!!

Gruß

Interruptor :oops:


Interruptor - Mo 30.06.03 07:17

Also bis jetzt hab ich es nur unter Software gefunden allerdings kann ich doch nicht erwarten das an jedem Computer eine Ati Karte drinen wäre. Der weg währe demnach!!

HKLM\Software\InstalledOptions\Microsoft Corporation\Video\ATI Technologies Inc.\

Gruß

Interruptor


Interruptor - Di 01.07.03 13:39

So nun habe ich den Pfad gefunden!!!

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI

Da sind nun lauter unterordner wie

VEN_1000&DEV_0006&SUBSYS_00000000&REV_02
VEN_1000&DEV_0006&SUBSYS_00000000&REV_03
...

Wie kann ich nun sagen das er die Ordner auslesen soll da ich ja sonst nicht den kompletten Pfad angeben kann?

Gruß

Interruptor :?:


Delete - Di 01.07.03 13:43

Eine andere Möglichkiet von der ich gehört habe, wäre die SetupAPI:
http://www.delphi-groups.de/YaBBSe/index.php?board=6;action=display;threadid=15582


Interruptor - Di 01.07.03 13:48

Nun da gehe ich doch lieber auf die regestry!!

Was ich nur noch wissen muss ist wie ich ordner auslesen kann also die Bezeichnungen

VEN_1000&DEV_0006&SUBSYS_00000000&REV_02

aus dem Ordner PCI!

Gruß

Interruptor


Delete - Di 01.07.03 13:50

Kuck mal in der Hilfe unter TRegistry, da steht alles, was du brauchst.


Interruptor - Di 01.07.03 13:53

Hab ich schon da hab ich nichts gefunden und in Google auch nicht!!!


foxy - Di 01.07.03 14:09

das glaub ich dir nicht das du da nichts gefunden hast.

da steht, wie man einen schlüssel ausliest, oder einen schreibt 100% auch wenn ich sie jetzt nicht auffem bildschirm habe, weil das gehört zu den grundkenntissen der reg bearbeitung


Interruptor - Mi 02.07.03 12:19

So ich habe es geschaft!! Unter google hatte ich da nun wirklich nichts zu gefunden aber in der Hilfe habe ich dann etwas länger geforcdet und bin dann letztentlich doch fündig geworden!!
Das ganze ist zwar etwas langwiedriger und komplizierter gewesen als ich es mir gedacht hatte aber es functioniert!!

Was ich jetzt nur noch nicht gefunden habe Ist die Angabe des motherboards!! Ich habe die Regestry durchsucht aber nichts gefunden!! Weis jemand von euch wo man das findet??

Gruß

Ronny


Tino - Mi 02.07.03 14:22

Interruptor hat folgendes geschrieben:
So ich habe es geschaft!! Unter google hatte ich da nun wirklich nichts zu gefunden aber in der Hilfe habe ich dann etwas länger geforcdet und bin dann letztentlich doch fündig geworden!!

Sagst du uns auch wie du es jetzt gelöst hast? Danke!

Gruß
Tino


Interruptor - Mi 02.07.03 14:28

Ich hab die mit dem code gelöst!! Allerdings muss ich dazu sagen das ich das Tool gerade bei meinem kollegen am Rechner getestet habe und es nicht functioniert hat. Anscheinend ist der Weg in der Regestry von Rechner zu Rechner anders. Ich dachte eigentich nur von Betriebssystem zu Betriebssystem aber nun gut. Ich setzte mal dies rein vieleicht weis einer von euch was!!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
function GetHardware: string;
var reg: TRegistry;
    val, val2: Tstringlist;
    I,Z : Integer;
    way, anhang : string;
begin
  Form1.memo2.Lines.clear;
  result:='Unbekannte Geräte';
  reg:=TRegistry.Create;
  way := '\SYSTEM\CurrentControlSet\Enum\PCI';
  try
    val := tstringlist.Create;
    val2:= tstringlist.Create;
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if not Reg.OpenKey(way,False) then
        ShowMessage('Error opening key')
    else
    begin
      reg.GetkeyNames(val);
      for I:=0 to Val.Count-1 do
      begin
        anhang := '';
        anhang := way + '\' + val.Strings[i];
        if not reg.OpenKey(anhang,false) then
          showmessage('Der Weg war wohl falsch wa')
        else
          begin
            reg.GetKeyNames(val2);
            for Z:=0 to Val2.count-1 do
            begin
              anhang := '';
              anhang := way + '\' + val.strings[i] + '\' + val2.Strings[z];
              if not reg.OpenKey(anhang,false) then
                showmessage('Da gibt es nichts')
            else
              Form1.Memo2.Lines.Add(reg.ReadString('DeviceDesc'))
          end;
        end;
      end;
    end;
  finally
    reg.free;
  end;
end;

Viel Spaß

Gruß

Interruptor :x

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Delete - Mi 02.07.03 14:36

Du gibst die Stringlisten nicht wieder frei. :roll:


Interruptor - Mi 02.07.03 17:08

Das geht aber auch ohne der Freigabe!!! Aber wieso wieder frei geben??? du meinst aber jetzt schon die TStrings variable var und var2 oder?
Da verstehe ich nicht warum ich da was frei geben soll? das geht so wie es ist nur sagt er mir wenn ich es an einem anderen computer ausprobiere 'Error opening key' Also steigt schon bei der ersten if abfrage aus. Das soll somit heisen, dass der Pfad way = \SYSTEM\CurrentControlSet\Enum\PCI nicht exestiert, was er allerdings tut.

Ich schaue aber mal nach vieleicht finde ich noch den Fehler!!

Gruß

Interruptor


Interruptor - Mi 02.07.03 18:02

Jipi jo ich habe es geschaft!!! War eigentlich ganz simple!!! Er hat ab ab \System\CurrentControlSet\Enum keine rechte mehr und darf deswegen nicht weitermachen. mit reg.openkeyreadonly geben wir ihm das Recht das zu lesen!!!

hier der Code!! Liest den ganzen PCI bus aus!!!!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
function GetHardware: string;
var reg: TRegistry;
    val, val2: Tstringlist;
    I,Z : Integer;
    way, anhang : string;
begin
  Form1.memo2.Lines.clear;
  result:='Unbekannte Geräte';
  reg:=TRegistry.Create;
  way := '\SYSTEM\CurrentControlSet\Enum\PCI';
  try
    val := tstringlist.Create;
    val2:= tstringlist.Create;
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if not Reg.OpenKeyReadOnly(way) then
        ShowMessage('Error opening key')
    else
    begin
      reg.GetkeyNames(val);
      for I:=0 to Val.Count-1 do
      begin
        anhang := '';
        anhang := way + '\' + val.Strings[i];
        if not reg.OpenKeyReadonly(anhang) then
          showmessage('erste *mist*e')
        else
          begin
            reg.GetKeyNames(val2);
            for Z:=0 to Val2.count-1 do
            begin
              anhang := '';
              anhang := way + '\' + val.strings[i] + '\' + val2.Strings[z];
              if not reg.OpenKeyReadOnly(anhang) then
                showmessage('*mist*e')
            else
              Form1.Memo2.Lines.Add(reg.ReadString('DeviceDesc'));
          end;
        end;
      end;
    end;
  finally
    reg.free;
  end;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Delete - Mi 02.07.03 18:54

Dann ruf die Prozedur mal ein paar mal hintereinander auf. Wenn du Windows2000 oder XP hast, wirst du bemerken wie dein Programm immer mehr Speicher braucht.

Mit

Delphi-Quelltext
1:
val1 := TStringList.Create;                    

Belegst du speicher, den du aber nicht wieder frei gibst.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
val1 := TStringlist.Create;
try
  // was mit der Stringliste machen
finally
  val1.Free;
end;

So sieht das richtig aus.


Interruptor - Mi 02.07.03 19:01

Ohh vielen dank da bessere ich das doch gleich noch mit aus!!!

Aber weist du vieleicht noch wo ich die Motherboard spezifikation (Model und Hersteller) auslesen kann?
Dann wäre das Tool nämlich fertig!!!

Gruß

Interruptor :roll:


Interruptor - Do 03.07.03 15:12

Weis den nun niemand wie man den Hersteller und die Bezeichnung vom Motherboard auslesen kann?

Bitte helft mir!!

:cry:


wiesel722 - Mo 28.07.03 09:53
Titel: hardware auslesen
hi interruptor


wen ich deinen code laufen lassen, ist mein memo-feld leer. habe ich was vergessen?

andreas


Delete - Mo 28.07.03 14:24
Titel: Re: hardware auslesen
wiesel722 hat folgendes geschrieben:
habe ich was vergessen?

Vielleicht die Tatsache, dass sich die Infos unter 9x-Systemen (Win 95, 98, ME) im Schlüssel HKLM\Enum\PCI befinden. Der Schlüssel von Interruptor (HKLM\SYSTEM\CurrentControlSet\Enum\PCI) gilt wohl nur für NT-Systeme. Eine Möglichkeit ist, den Schlüssel OS-abhängig zu füllen:

Delphi-Quelltext
1:
2:
3:
4:
if(Win32Platform = VER_PLATFORM_WIN32_NT) then
  way := '\SYSTEM\CurrentControlSet\Enum\PCI'
else
  way := '\Enum\PCI';

Das sollte helfen.


Interruptor - Mo 28.07.03 17:38

Was nutzt du für ein Betriebssystem? :?:


Interruptor - Mo 28.07.03 17:39

Genau das wollte ich damit sagen!!! Danke schön!!! :!: