Не удалось преобразовать вариант типа (Null) в тип (OleStr)
знаете ли вы, почему блок кода ниже отрицает "не удалось преобразовать вариант типа (Null) в тип (OleStr)" на некоторых компьютерах, не все из них, но 3 из десяти компьютеров генерируют сообщение об ошибке.
function GetWMIstringSW(const WMIClass, WMIProperty:string): string;
const
wbemFlagForwardOnly = 000020;
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');
большое спасибо за вашу помощь.
4 ответов
код завершается ошибкой, когда значение свойства WMI возвращает null. Это можно исправить, проверив, имеет ли свойство значение null перед приведением или преобразованием в строку. Для этой задачи вы можете использовать VarIsNull
чтобы избежать сообщения об ошибке do
NullStrictConvert: = false; / / избегайте ошибки преобразования null OLE
иногда FWbemObject не является нулевым, но исключение-raise : "Не удается преобразовать массив вариантов в OleStr"
Как пример : в BiosVersion (массив) Чтобы решить эту проблему, попробуйте следующее:
для I:= VarArrayLowBound(FWbemObject.BIOSVersion, 1) к VarArrayHighBound(FWbemObject.BIOSVersion, 1) не Л. Добавить( VarToStr(FWbemObject.BIOSVersion[я]) );
в отношении
готовить после тяжелого трудового
Если вы хотите, чтобы нулевые варианты автоматически преобразовывались в пустые строки, 0 целых чисел или ложные логические значения, установите NullStrictConvert
(системный блок.Варианты) до False
.