2013-04-25 41 views
7

一部のコンピュータでは、コードのブロックが「タイプ(Null)の型を型(OleStr)に変換できませんでした」それらのすべてが10台中3台のコンピュータがエラーメッセージを生成します。タイプ(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

? –

+0

なぜ、jsutは 'MagWMI'ラッパーを使用していませんか? –

答えて

12

WMIプロパティの値がnullを返すと、コードが失敗します。キャストするか、文字列に変換する前にプロパティが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

あなたは自動的にtrueにNullStrictConvert(単位System.Variants)を設定し、文字列、0の整数、またはfalseのブール値を空にするために、変換するバリアントをゼロにしたい場合。

2

エラーメッセージを避けるために行う

NullStrictConvert:= falseは、 //

1

時々、NULL OLE変換エラーを回避するため、FWbemObjectはNULLではないですが、例外は昇給です: は「OLESTRにバリアントの配列を変換Can'nt」exempleとして

:BiosVersionは(配列です) それを解決するために、これを試してみてください。

を私のために:= VarArrayLowBound(FWbemObject.BIOSVersion、1)にVarArrayHighBound(FWbemObject.BIOSVersion、1) L.Add(VarToStr(FWbemObjectを行います。 BIOSV ersion [i])); nullのバリアント

よろしく

Zerrouki

関連する問題