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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- .net – Windows Phone 7:不支持现有库?
- windows-phone-7 – 适用于Windows Mobile 6.5和Windows Ph
- windows-server-2012 – 如何在Windows Server 2012中为IIS
- windows-server-2008 – 针对AD Server 2008和2008 R2 DCs的
- windows – 使用漫游配置文件缓慢登录
- active-directory – 内置的“提供远程协助”因权限无法正常
- windows – 如何在没有确认的情况下从命令行删除计划任务?
- windows – cmd字符串替换特殊字符
- 如何在Windows 10 Enterprise上运行应用程序作为shell替换
- wcf – 我们可以将Workflow服务作为Windows服务托管吗?
推荐文章
站长推荐
热点阅读