2016-05-06 4 views
1
procedure GetWin32_DiskDriveInfo; 
const 
    WbemUser   =''; 
    WbemPassword  =''; 
    WbemComputer  ='localhost'; 
    wbemFlagForwardOnly = $00000020; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService : OLEVariant; 
    FWbemObjectSet: OLEVariant; 
    FWbemObject : Variant; 
    oEnum   : IEnumvariant; 
    sValue  : string; 
begin 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, FWbemObject, nil) = 0 do 

ので、私がいる[DCC32エラー] Project2.dpr(29):実際の正式のvarパラメータのE2033の種類が同一でなければなりません。私は上のコードの最後の行に(私はそれがFWbemObjectと何か関係があると思います)変数を持っています。 私はDelphi 10 Seattleを使用しています。エラー/手順

+2

エラーの意味を理解していますか? –

+0

私はhttp://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_var_type_conflict_xml.htmlを読んでいます。私は理解していますが、修正できないようです。 –

+0

ソースはhttp://stackoverflow.com/questions/8519658/how-to-call-a-list-of-the-physically-attached-hard-disks-using-free-pascal-orから取得されているため、それがOPのために働いているなら、それが私のために働いていないのはなぜだろうか。 –

答えて

2

RRUZ answerで使用したコードはfpc用です。

使用デルファイのためのこのlink、このコード:ルーチンはシアトルのためにいくつかの変更を必要と

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    ActiveX, 
    ComObj, 
    Variants; 



// The Win32_DiskDrive class represents a physical disk drive as seen by a computer running the Win32 operating system. Any interface to a Win32 physical disk drive is a descendent (or member) of this class. The features of the disk drive seen through this object correspond to the logical and management characteristics of the drive. In some cases, this may not reflect the actual physical characteristics of the device. Any object based on another logical device would not be a member of this class. 
// Example: IDE Fixed Disk. 

procedure GetWin32_DiskDriveInfo; 
const 
    WbemUser   =''; 
    WbemPassword  =''; 
    WbemComputer  ='localhost'; 
    wbemFlagForwardOnly = $00000020; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService : OLEVariant; 
    FWbemObjectSet: OLEVariant; 
    FWbemObject : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 
begin; 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, FWbemObject, iValue) = 0 do 
    begin 
    Writeln(Format('DeviceID %s',[String(FWbemObject.DeviceID)]));// String 

    Writeln(''); 
    FWbemObject:=Unassigned; 
    end; 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     GetWin32_DiskDriveInfo; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln;  
end. 
3

こと - 以下を参照してください。

2番目のParam to oEnum.NextはOleVariantで、3番目のパラメータはLongWordです。また、あなたはのCoInitialize /に、counitialize

procedure GetWin32_DiskDriveInfo; 
const 
    WbemUser   =''; 
    WbemPassword  =''; 
    WbemComputer  ='localhost'; 
    wbemFlagForwardOnly = $00000020; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService : OLEVariant; 
    FWbemObjectSet: OLEVariant; 
    FWbemObject : OleVariant; // NOT Variant 
    oEnum   : IEnumvariant; 
    sValue  : string; 
    Fetched : LongWord; // Added, required 3rd Param to oEnum.Next 
begin; 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, FWbemObject, Fetched) = 0 do 
    begin 
    sValue:= FWbemObject.Properties_.Item('Caption').Value; 
    Writeln(Format('Caption  %s',[sValue]));// String 
    sValue:= FWbemObject.Properties_.Item('DeviceID').Value; 
    Writeln(Format('DeviceID  %s',[sValue]));// String 
    sValue:= FWbemObject.Properties_.Item('Model').Value; 
    Writeln(Format('Model   %s',[sValue]));// String 
    sValue:= FWbemObject.Properties_.Item('Partitions').Value; 
    Writeln(Format('Partitions  %s',[sValue]));// Uint32 
    sValue:= FWbemObject.Properties_.Item('PNPDeviceID').Value; 
    Writeln(Format('PNPDeviceID %s',[sValue]));// String 
    sValue:= FormatFloat('#,', FWbemObject.Properties_.Item('Size').Value/(1024*1024)); 
    Writeln(Format('Size   %s mb',[sValue]));// Uint64 

    Writeln; 
    FWbemObject:= Unassigned; 
    end; 
end; 

begin 
    CoInitialize(Nil); // Added 

    try 
    GetWin32_DiskDriveInfo; 
    except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
    end; 
    Writeln('Press Enter to exit'); 
    Readln; 
    CoUnInitialize; //Added 
end. 
4

FPCのために、デルファイの下であなたは、いくつかの変更を行う必要がある場合は、使用しているコードを呼び出す必要があります。 IEnumVARIANT.Next機能が

function Next(celt: LongWord; var rgvar : OleVariant; out pceltFetched: LongWord): HResult; stdcall; 

を定義する方法

このですから、OleVariantにFWbemObjectの種類を変更し、pceltFetchedのparamのために別の変数を追加する必要があります。また、その

FWbemObject : OLEVariant; 
    pceltFetched : LongWord; 
begin 
    ... 
    ... 
    while oEnum.Next(1, FWbemObject, pceltFetched) = 0 do 
    ... 
    ... 

end; 

同様

アプリがCoInitializeメソッドの呼び出しを覚えてコンソールからこのコードを使用したい場合。