web-dev-qa-db-ja.com

タイプ(Null)のバリアントをタイプ(OleStr)に変換できませんでした

以下のコードブロックが一部のコンピューターで「タイプ(Null)のバリアントをタイプ(OleStr)に変換できませんでした」を無効にする理由を知っていますか?すべてではありませんが、10台のコンピューターのうち3台がエラーメッセージを生成します。

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');

手伝ってくれてどうもありがとう。

7
Cor4Ever

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)]));
12
RRUZ

エラーメッセージを回避するには、

NullStrictConvert:= false; // NULLを回避OLE変換エラー

2
user3032386

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

1
Jan Doggen

FWbemObjectがNULLでない場合がありますが、例外が発生します:「OleStrでバリアントの配列を変換できません」

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

for I:= VarArrayLowBound(FWbemObject.BIOSVersion、1)to VarArrayHighBound(FWbemObject.BIOSVersion、1)do L.Add(VarToStr(FWbemObject .BIOSVersion [i]));

よろしく

ゼロウキ

1
Zerrouki