以下のコードブロックが一部のコンピューターで「タイプ(Null)のバリアントをタイプ(OleStr)に変換できませんでした」を無効にする理由を知っていますか?すべてではありませんが、10台のコンピューターのうち3台がエラーメッセージを生成します。
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');
手伝ってくれてどうもありがとう。
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)]));
エラーメッセージを回避するには、
NullStrictConvert:= false; // NULLを回避OLE変換エラー
Nullバリアントを自動的に空の文字列、0整数、または偽のブール値に変換する場合は、NullStrictConvert
(単位System.Variants)をFalse
に設定します。
FWbemObjectがNULLでない場合がありますが、例外が発生します:「OleStrでバリアントの配列を変換できません」
例として:BiosVersion(配列です)それを解決するには、これを試してください:
for I:= VarArrayLowBound(FWbemObject.BIOSVersion、1)to VarArrayHighBound(FWbemObject.BIOSVersion、1)do L.Add(VarToStr(FWbemObject .BIOSVersion [i]));
よろしく
ゼロウキ