现我机器上有硬盘A,硬盘B,移动硬盘C,U盘D
请问如何同时能得到这些磁盘驱动器的名字和类型呢!在线等!

解决方案 »

  1.   

    这里有个功能可以实现, 匆匆忙忙写的 ,要下班了 :) 
      自己看看吧  希望能帮你
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        FDriveStrings: String;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);function GetDriveString(Index: Integer): string;
    // Helper method to extract a sub string (given by Index) from FDriveStrings.
    var
      Head, Tail: PChar;
    begin
      Head := PChar(FDriveStrings);
      Result := '';
      repeat
        Tail := Head;
        while Tail^ <> #0 do
          Inc(Tail);
        if Index = 0 then
        begin
          SetString(Result, Head, Tail - Head);
          Break;
        end;
        Dec(Index);
        Head := Tail + 1;
      until Head^ = #0;
    end;
    Var
      I,
      Count: Integer;
      DriveMap,
      Mask: Cardinal;
    begin
      DriveMap := GetLogicalDrives;
      Mask := 1;
      for I := 0 to 25 do
      begin
        if (DriveMap and Mask) <> 0 then
          Inc(Count);
        Mask := Mask shl 1;
      end;
      Count := GetLogicalDriveStrings(0, nil);
      SetLength(FDriveStrings, Count);
      GetLogicalDriveStrings(Count, PChar(FDriveStrings));
      For I := 0 To 5 Do
      Begin
        ShowMessage(GetDriveString(I))
      End;
    end;
      

  2.   

    下面的代码有点问题,不过思路在这了。
    unit Disks;
    interfaceuses windows,Messages,SysUtils,Dialogs;
    const
      Method_Buffered                 = 0;
      File_Any_Access                 = 0;
      File_Device_Mass_Storage        = $0000002D;
      IOCTL_Storage_Base              = File_Device_MASS_Storage;// $002Dtype
    // 存储设备的总线类型
      pSTORAGE_BUS_TYPE=^STORAGE_BUS_TYPE;
      STORAGE_BUS_TYPE =(
        BusTypeUnknown = $00,
        BusTypeScsi,
        BusTypeAtapi,
        BusTypeAta,
        BusType1394,
        BusTypeSsa,
        BusTypeFibre,
        BusTypeUsb,
        BusTypeRAID,
        BusTypeMaxReserved = $7F
    );// 查询存储设备属性的类型
     pSTORAGE_QUERY_TYPe=^STORAGE_QUERY_TYPE;
      STORAGE_QUERY_TYPE =(
        PropertyStandardQuery = 0,          // 读取描述
        PropertyExistsQuery,                // 测试是否支持
        PropertyMaskQuery,                  // 读取指定的描述
        PropertyQueryMaxDefined         // 验证数据
    );// 查询存储设备还是适配器属性
    pSTORAGE_PROPERTY_ID=^PSTORAGE_PROPERTY_ID;
    STORAGE_PROPERTY_ID =(
        StorageDeviceProperty = 0, // 查询设备属性
        StorageAdapterProperty // 查询适配器属性
    );// 查询属性输入的数据结构
    PSTORAGE_PROPERTY_QUERY=^STORAGE_PROPERTY_QUERY;
    STORAGE_PROPERTY_QUERY = packed record
    PropertyId:STORAGE_PROPERTY_ID ; // 设备/适配器
    QueryType:STORAGE_QUERY_TYPE ; // 查询类型
      AdditionalParameters:string[1]; // 额外的数据(仅定义了象征性的1个字节)
    end;
    // 查询属性输出的数据结构
    PSTORAGE_DEVICE_DESCRIPTOR=^STORAGE_DEVICE_DESCRIPTOR;
    STORAGE_DEVICE_DESCRIPTOR = packed record
        Version:ULONG;                    // 版本
        Size:ULONG;                       // 结构大小
        DeviceType:UCHAR;                  // 设备类型
        DeviceTypeModifier:UCHAR;         // SCSI-2额外的设备类型
        RemovableMedia:Boolean;           // 是否可移动
        CommandQueueing:Boolean;          // 是否支持命令队列
        VendorIdOffset:Ulong;             // 厂家设定值的偏移
        ProductIdOffset:ULONG;            // 产品ID的偏移
        ProductRevisionOffset:ULONG;      // 产品版本的偏移
        SerialNumberOffset:ULONG;        // 序列号的偏移
        BusType:STORAGE_BUS_TYPE ;         // 总线类型
        RawPropertiesLength:ULONG;       // 额外的属性数据长度
        RawDeviceProperties:string[1];     // 额外的属性数据(仅定义了象征性的1个字节)} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
    end;function GetDriveProperty(hDevice:Thandle;pDevDesc:PSTORAGE_DEVICE_DESCRIPTOR):Boolean;
    function Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;implementationfunction Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;
    begin
      Result:= (DeviceType shl 16) or (Access shl 14) or (FuncNo shl 2) or (Method)
    end;function GetDriveProperty(hDevice:Thandle;pDevDesc:PSTORAGE_DEVICE_DESCRIPTOR):Boolean;
    var
        Query:STORAGE_PROPERTY_QUERY;    // 查询输入参数
        dwOutBytes:Dword;                // IOCTL输出数据长度
        IOCTL_STORAGE_QUERY_PROPERTY:integer;
    begin
        // 指定查询方式
        IOCTL_STORAGE_QUERY_PROPERTY:=Ctl_Code(IOCTL_STORAGE_BASE, $0500, METHOD_BUFFERED, FILE_ANY_ACCESS);
        Query.PropertyId:= StorageDeviceProperty;
        Query.QueryType:= PropertyStandardQuery;
        Result:=DeviceIoControl(hDevice, // 设备句柄
            IOCTL_STORAGE_QUERY_PROPERTY ,    // 取设备属性信息
            @Query,
            sizeof(Query),        // 输入数据缓冲区
            pDevDesc,              // 输出数据缓冲区
            pDevDesc.Size,         // 输出数据长度
            dwOutBytes,
            nil);             // 用同步I/O
    end;end.
      

  3.   

    虽然上面没有谁为我处理了问题,但是也让我长了见识,我已经写好了一个程序,在我的blog上
    http://blog.csdn.net/zyxmeng/archive/2005/08/29/467524.aspx