2013-04-25 22 views
7

Czy wiesz, dlaczego blok kodu poniżej zaneguje "Nie można przekonwertować wariantu typu (Null) na typ (OleStr)" na niektórych komputerach, nie wszystkie z nich, ale trzy na dziesięć komputerów generują komunikat o błędzie.Nie można przekonwertować wariantu typu (Null) na typ (OleStr)

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; 

Funkcja ta jest następnie wykonywany w FormCreate:

GETWMIstringSW('Win32_Product','Name'); 

Dziękuję bardzo za pomoc.

+0

Który wariant jest zerowy? –

+0

Dlaczego nie skorzystać z gotowych owijaczy "MagWMI"? –

Odpowiedz

12

Kod nie powiedzie się, gdy wartość właściwości WMI zwróci wartość null. Możesz to naprawić, sprawdzając, czy właściwość ma wartość null przed rzutowaniem lub konwertowaniem na ciąg znaków. Do tego zadania można użyć funkcji VarIsNull lub po prostu użyć metody VarToStr, aby bezpiecznie przekonwertować warianty na łańcuchy takie jak w tym przypadku.

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

Jeśli chcesz null warianty mają być automatycznie konwertowane na pustych strunach, 0 całkowite lub fałszywych wartości logiczne, ustaw NullStrictConvert (System.Variants katalogowa) true.

2

Aby uniknąć komunikatu o błędzie zrobić

NullStrictConvert: = false; // uniknąć błędów konwersji NULL OLE

1

Czasami FWbemObject nie jest NULL, ale wyjątek jest podbicie: "Can'nt konwertować tablicę Variant w OleStr"

Jak exemple: the BiosVersion (jest tablicą) aby go rozwiązać, spróbuj tego:

dla I: = VarArrayLowBound (FWbemObject.BIOSVersion, 1), aby VarArrayHighBound (FWbemObject.BIOSVersion, 1) zrobić L.Add (VarToStr (FWbemObject. BIOSV ersion [i]));

Pozdrowienia

Zerrouki

Powiązane problemy