使用Delphi查找特殊驱动器

卡纳迪亚人

我试图在Delphi 2007中编写一个小程序,以便在将便携式USB驱动器插入Windows 7计算机时访问文件。但是,该驱动器未显示为标准驱动器号。它显示在Windows资源管理器中的“便携式设备”下。我编写了以下代码来枚举“计算机”下的所有项目:

Procedure TfrmMain.ComputerChanged(Var Msg: TMessage);
Var
  Enum: IEnumIDList;
  Fetched: Longword;
  Item: PItemIDList;
  Path: String;
  Computer: IShellFolder;
  StrRet: TSTRRET;
Begin
  Status('Computer changed...  Checking folders.');
  fDesktop.BindToObject(fCompPidl, Nil, IID_IShellFolder, Computer);
  If Assigned(Computer) And
     (Computer.EnumObjects(Self.Handle, SHCONTF_FOLDERS, Enum) = NOERROR) Then
  Begin
    While (Enum.Next(1, Item, Fetched) = NOERROR) Do
    Begin
      FillChar(StrRet, SizeOf(StrRet), #0);
      Computer.GetDisplayNameOf(Item, SHGDN_FORADDRESSBAR or SHGDN_NORMAL, StrRet);
      Path := StrRetToStr(StrRet, Item);
      Status(Path);
    End;
  End;
End;

(注意:“状态”过程仅向TMemo输出一条消息。)

每当Windows Shell子系统通知我的应用程序有更改时,就会调用此方法。它枚举了所有本地驱动器和网络驱动器,但没有其他枚举(也缺少iCloud Photos驱动器)。

有谁知道我如何访问这些虚拟驱动器上的文件?

佐伊·彼得森(ZoëPeterson)

您很有可能没有正确初始化COM。如果您不调用CoInitializeEx或以错误的值调用它,则您的代码将按原样工作,但是便携式设备驱动程序需要单元线程才能工作。

根据您的代码,这是一个示例应用程序,可以正常运行并显示便携式设备。如果您注释掉CoInitializeEx/CoUninitialize调用或传递,COINIT_MULTITHREADED它仍然可以工作,但是只显示驱动器。

program ListMyComputer;

{$APPTYPE CONSOLE}

uses
  ComObj, ShlObj, ShellApi, ShLwApi, ActiveX, Windows, SysUtils;

var
  Enum: IEnumIDList;
  Fetched: Longword;
  CompPidl, Item: PItemIDList;
  Path: PWideChar;
  Desktop, Computer: IShellFolder;
  StrRet: TSTRRET;
begin
  CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
  try
    WriteLn('Computer changed...  Checking folders.');
    SHGetDesktopFolder(Desktop);
    SHGetFolderLocation(0, CSIDL_DRIVES, 0, 0, CompPidl);
    Desktop.BindToObject(CompPidl, Nil, IID_IShellFolder, Computer);
    CoTaskMemFree(CompPidl);
    If Assigned(Computer) And
       (Computer.EnumObjects(0, SHCONTF_FOLDERS, Enum) = NOERROR) Then
    Begin
      While (Enum.Next(1, Item, Fetched) = NOERROR) Do
      Begin
        FillChar(StrRet, SizeOf(StrRet), #0);
        Computer.GetDisplayNameOf(Item, SHGDN_FORADDRESSBAR or SHGDN_NORMAL, StrRet);
        StrRetToStr(@StrRet, Item, Path);
        WriteLn(Path);
        CoTaskMemFree(Path);
      End;
    End;
    WriteLn('Enumeration complete');
    ReadLn;
  finally
    CoUninitialize
  end;
end.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Delphi查找特殊驱动器

来自分类Dev

使用Python查找驱动器号(Windows)

来自分类Dev

使用WMIC查找物理驱动器上的分区号

来自分类Dev

尝试批量查找驱动器列表

来自分类Dev

如何使用USB驱动器/笔式驱动器?

来自分类Dev

如何查找仅使用drive.file范围的驱动器SDK来查找文件

来自分类Dev

如何使用批处理文件查找Windows的默认驱动器

来自分类Dev

如何使用Msbuild中的Property函数查找当前的工作目录驱动器号?

来自分类Dev

如何使用批处理文件查找Windows的默认驱动器

来自分类Dev

无法使用mdadm Ubuntu 18.04.1查找RAID 1 md0驱动器

来自分类Dev

Delphi和Google驱动器-API信息

来自分类Dev

使用Windows.Devices.Enumeration中的DeviceID在C#Windows 10 IoT核心版中查找可移动驱动器(USB)的驱动器号?

来自分类Dev

使用XCOPY的驱动器规范无效

来自分类Dev

使用Grub选择启动驱动器?

来自分类Dev

使用备用驱动器作为交换?

来自分类Dev

使用GParted克隆驱动器

来自分类Dev

哪个驱动器托架使用SSD?

来自分类Dev

使用的内核驱动器不是Nvidia

来自分类Dev

使用磁带驱动器而不是HDD?

来自分类Dev

使用Gparted完全清除驱动器

来自分类Dev

设置家庭使用的NAS驱动器

来自分类Dev

使用CIF替换远程驱动器

来自分类Dev

查找分配给主驱动器的字母

来自分类Dev

查找哪些驱动器连接到计算机

来自分类Dev

查找图形卡/驱动器详细信息

来自分类Dev

查找逻辑驱动器的文件大小限制

来自分类Dev

从单元掩码中查找所有逻辑驱动器

来自分类Dev

查找图形卡/驱动器详细信息

来自分类Dev

设置后LVM如何查找驱动器