2013-04-25 102 views
7

Wissen Sie, warum der folgende Code-Block die "Konnte Variante des Typs (Null) nicht in Typ (OleStr) konvertieren" auf einigen Computern nicht negieren alle von ihnen aber 3 von 10 Computern erzeugen die Fehlermeldung.Konnte Variante vom Typ (Null) in Typ (OleStr) nicht konvertieren

GETWMIstringSW('Win32_Product','Name'); 
für Ihre Hilfe

Vielen Dank:

enter image description here

function GetWMIstringSW(const WMIClass, WMIProperty:string): string; 

const 
    wbemFlagForwardOnly = $00000020; 

var 
    FWbemObjectSet: OLEVariant; 
    FWbemObject : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 
    LNode   : TTreeNode; 
    LNode2  : TTreeNode; 

begin 
    Result:=''; 
    FWbemObjectSet:= FWMIService.ExecQuery(Format('Select %s from %s',[WMIProperty, WMIClass]),'WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 

    while oEnum.Next(1, FWbemObject, iValue) = 0 do 
    begin 
     if not VarIsNull(FWbemObject.Properties_.Item(WMIProperty).Value) then 
     Result:=FWbemObject.Properties_.Item(WMIProperty).Value; 
     LNode := ClientForm.TreeView1.Items.AddChild(Node, Format('%s',[String(FWbemObject.Name)])); 

     LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, Format('%s',[String(FWbemObject.Version)])); 
     FWbemObject:=Unassigned; 
    end; 

end; 

Die Funktion bei Formcreate wird dann ausgeführt.

+0

Welche Variante ist null? –

+0

Warum nicht einfach fertige 'MagWMI'-Wrapper verwenden? –

Antwort

12

Ihr Code schlägt fehl, wenn der Wert einer WMI-Eigenschaft null zurückgibt. Sie können dies beheben und prüfen, ob die Eigenschaft vor dem Umwandeln oder Umwandeln in eine Zeichenfolge einen Nullwert hat. Für diese Aufgabe können Sie die VarIsNull Funktion verwenden oder einfach die VarToStr Methode verwenden, um Varianten in Strings wie diese sicher zu konvertieren.

LNode := ClientForm.TreeView1.Items.AddChild(Node, 
       Format('%s',[VarToStr(FWbemObject.Name)])); 
LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, 
       Format('%s',[VarToStr(FWbemObject.Version)])); 
1

Wenn Sie Varianten auf null automatisch leere Strings, 0 ganze Zahlen oder falsch booleans, auf true gesetzt NullStrictConvert (Einheit System.Variants) umgewandelt werden.

2

die Fehlermeldung zu vermeiden tun

NullStrictConvert: = false; //

1

Manchmal vermeiden NULL OLE Konvertierungsfehler ist die FWbemObject nicht NULL aber eine Ausnahme Erhöhung:

Als exemple "Can'nt ein Array von Variant in OLESTR umwandeln": die BiosVersion (ein Array ist ) um es zu lösen, versuchen sie dies:

für I: = VarArrayLowBound (FWbemObject.BIOSVersion, 1) bis VarArrayHighBound (FWbemObject.BIOSVersion, 1) tun L.Add (VarToStr (FWbemObject. BIOSV ersion [i]));

Grüße

Zerrouki