2013-04-25 687 views
7

您是否知道爲什麼代碼塊會在某些計算機上否定「無法將類型變量(Null)轉換爲類型(OleStr)」,而不是所有這些計算機都會生成錯誤消息。無法將類型變量(Null)轉換爲類型(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; 

的功能,然後在FORMCREATE執行:

GETWMIstringSW('Win32_Product','Name'); 

非常感謝你的幫助。

+0

將變異爲空? – 2013-04-25 21:35:36

+0

爲什麼不使用準備好的'MagWMI'包裝? – 2013-04-26 10:30:23

回答

12

當WMI屬性的值返回null時,您的代碼失敗。您可以修復此問題,檢查屬性是否有空值,然後轉換或轉換爲字符串。對於此任務,您可以使用VarIsNull函數或僅使用VarToStr方法將變體安全地轉換爲字符串,如下所示。

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

如果你想空的變體可自動轉換爲空字符串,整數0,或假布爾值,NullStrictConvert(單位System.Variants)設置爲true。

2

爲了避免該錯誤消息做

NullStrictConvert:= FALSE; // NULL避免OLE轉換錯誤

1

有時,FWbemObject不是NULL但一個例外是加註: 「Can'nt轉換變體的陣列中OLESTR」

作爲爲例:所述BiosVersion(是一個數組) 爲了解決這個問題,試試這個:

因爲我:= VarArrayLowBound(FWbemObject.BIOSVersion,1)VarArrayHighBound(FWbemObject.BIOSVersion,1)做 L.Add(VarToStr(FWbemObject。 BIOSV ersion [i]));

問候

Zerrouki

相關問題