我挂了CopyItems
IFileOperation
方法来监视/拦截windows中的文件副本。
我的问题是如何从IShellItem
(CopyItems的最后一个参数)中检索完整文件名
function New_CopyItems(p: Pointer; punkItems: IUnknown;psiDestinationFolder: IShellItem): HResult; stdcall;
psiDestinationFolder
有一个名为GetDisplayName
的方法,只返回当前文件的文件夹名称开始复制!!但我想获得完整的文件名,不知道我应该做什么!有什么其他方法可以帮助我获得全名?或者我必须使用其他API ....?
打扰一下,如果我的英语不好!
答案 0 :(得分:2)
CopyItems
方法可能会复制多个项目。所以马上你就错了,寻找一个文件名。这是一个非常复杂的API,您需要仔细阅读documentation并清楚地了解该函数的工作原理。
psiDestinationFolder
参数是标识目的地的IShellItem
。使用GetDisplayName
方法获取文件路径。
另一个参数punkItems
更复杂。它记录如下:
指向IShellItemArray,IDataObject或IEnumShellItems对象的IUnknown的指针,该对象表示要复制的项目组。您还可以指向IPersistIDList对象来表示单个项目,从而有效地完成与IFileOperation :: CopyItem相同的功能。
这告诉您,您收到的IShellItemArray
界面后面可能有IDataObject
,IEnumShellItems
,IPersistIDList
或IUnknown
个对象。并且该单个对象中可能有多个项目,每个项目都要复制到目标文件夹。您需要依次查询punkItems
每个可能的界面,直到找到您必须处理的这些可能性中的哪一个。然后用特殊代码处理每一个。为了测试这一点,您需要编写使用每个可能接口调用CopyItems
的代码。您将从四个接口中的每一个的文档中找到如何完成所有这些操作。如果您还不熟悉shell编程和COM,那么在完成这项工作之前,请务必这样做。
最后,我怀疑这是检测文件复制的一种非常好的方法。使用许多不同的API复制文件。而IFileOperation.CopyItems
只是其中之一。如果您只挂钩IFileOperation.CopyItems
,那么您将错过很多文件复制操作。