2013-04-25 39 views
7

Bạn có biết tại sao khối mã dưới đây sẽ phủ nhận "Không thể chuyển đổi kiểu của loại (Null) thành loại (OleStr)" trên một số máy tính, không tất cả chúng nhưng 3 trong số mười máy tính tạo ra thông báo lỗi.Không thể chuyển đổi biến thể loại (Null) thành loại (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; 

Chức năng sau đó sẽ được thực hiện tại FormCreate:

GETWMIstringSW('Win32_Product','Name'); 

Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn.

+0

Những biến thể là null? –

+0

Tại sao jsut không sử dụng sẵn sàng 'MagWMI' wrappers? –

Trả lời

12

Bạn mã không thành công khi giá trị của thuộc tính WMI trả về giá trị rỗng. Bạn có thể sửa lỗi này, kiểm tra xem thuộc tính có giá trị null trước khi truyền hay chuyển đổi thành chuỗi không. Đối với tác vụ này, bạn có thể sử dụng hàm VarIsNull hoặc chỉ sử dụng phương thức VarToStr để chuyển đổi một cách an toàn các biến thành chuỗi như vậy.

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

Nếu bạn muốn rỗng biến thể được tự động chuyển thành chuỗi rỗng, 0 số nguyên hoặc boolean sai, hãy đặt NullStrictConvert (đơn vị System.Variants) thành true.

2

Để tránh thông báo lỗi làm

NullStrictConvert: = false; // tránh lỗi chuyển đổi NULL OLE

1

Đôi khi, FWbemObject không phải là NULL nhưng một ngoại lệ là tăng lương: "Can'nt chuyển đổi một mảng của Ngôn ngữ địa phương trong OleStr"

Như dụ: các BiosVersion (là một mảng) để giải quyết nó, hãy thử này:

cho I: = VarArrayLowBound (FWbemObject.BIOSVersion, 1) để VarArrayHighBound (FWbemObject.BIOSVersion, 1) làm L.Add (VarToStr (FWbemObject. BIOSV ersion [i]));

Trân

Zerrouki

Các vấn đề liên quan