Hallo,
ich versuche schon seid Stunden mir den Namen der Festplatte anzeigen zu lassen, auf der Windows installiert ist. Für den zugriff auf die Win Klassen benutze ich folgende Funktion:
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:
| function GetWMIstring(wmiHost, wmiClass, wmiProperty: string): string; var Locator: ISWbemLocator; Services: ISWbemServices; SObject: ISWbemObject; ObjSet: ISWbemObjectSet; SProp: ISWbemProperty; Enum: IEnumVariant; Value: Cardinal; TempObj: OleVariant;
begin try Locator := CoSWbemLocator.Create; Services := Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '', '', 0, nil); ObjSet := Services.ExecQuery('SELECT * FROM ' + wmiClass, 'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly, nil); Enum := (ObjSet._NewEnum) as IEnumVariant; while (Enum.Next(1, TempObj, Value) = S_OK) do begin SObject := IUnknown(tempObj) as ISWBemObject; SProp := SObject.Properties_.Item(wmiProperty, 0); if VarIsNull(SProp.Get_Value) then result := '' else begin result := SProp.Get_Value; end; end; except on exception do result := ''; end; end; |
Ich habe nun in vielen Klassen Einträge gefunden, die mir den Festplattennamen (Produktname Bsp: WD2500YS) zurückgegeben, aber wenn ein USB-Stick oder Speicherlesegerät drin ist, wird dieses angezeigt, was ja nicht Sinn der Sache ist. Weiß jmd den richtigen Eintrag oder eine Möglichkeit wie ich zum erwünschten Ergebnis komme?
Desweiteren ist mir auch aufgefallen, dass beim Aufrufen der obigen Funktion der Speicher gefüllt wird,a ber nicht wieder geleert wird. Da ich diese Funktion in meinem Programm ziemlich oft aufrufe, steigt er Speicherverbrauch stark an. Wie kann man die Funktion abändern, damit er weniger verbraucht? Habe schon versucht verschiedene Sachen freizugeben, aber hat immer in einer Fehlermeldung geendet...