加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 使用Delphi查找特殊驱动器

发布时间:2020-12-14 01:35:13 所属栏目:Windows 来源:网络整理
导读:我正在尝试在Delphi 2007中编写一个小程序,以便在插入 Windows 7计算机时访问便携式USB驱动器中的文件.此驱动器不会显示为标准驱动器号.它出现在Windows资源管理器中的便携设备下.我编写了以下代码来枚举“计算机”下的所有项目: Procedure TfrmMain.Comput
我正在尝试在Delphi 2007中编写一个小程序,以便在插入 Windows 7计算机时访问便携式USB驱动器中的文件.此驱动器不会显示为标准驱动器号.它出现在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;

(注意:Status过程只是向TMemo输出一条消息.)

每当我的应用程序收到Windows shell子系统的更改通知时,都会调用此方法.它列举了所有本地驱动器和网络驱动器,但没有其他内容(iCloud Photos驱动器也缺失).

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

解决方法

您很可能没有正确初始化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,CompPidl);
    Desktop.BindToObject(CompPidl,Computer);
    CoTaskMemFree(CompPidl);
    If Assigned(Computer) And
       (Computer.EnumObjects(0,Enum) = NOERROR) Then
    Begin
      While (Enum.Next(1,Fetched) = NOERROR) Do
      Begin
        FillChar(StrRet,#0);
        Computer.GetDisplayNameOf(Item,StrRet);
        StrRetToStr(@StrRet,Path);
        WriteLn(Path);
        CoTaskMemFree(Path);
      End;
    End;
    WriteLn('Enumeration complete');
    ReadLn;
  finally
    CoUninitialize
  end;
end.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读