0

我挂钩了在 windows 中监视/拦截文件复制的CopyItems方法。IFileOperation我的问题是如何从(CopyItems 的最后一个参数)中检索完整的文件名IShellItem

function New_CopyItems(p: Pointer; punkItems: IUnknown;psiDestinationFolder: IShellItem): HResult; stdcall;

psiDestinationFolder一个方法调用GetDisplayName,只返回当前文件的文件夹名称开始复制!!但我想获得完整的文件名,不知道该怎么办!?还有其他方法可以帮助我获得全名吗?或者我必须使用另一个 API ....?

对不起,如果我的英语不好!

4

1 回答 1

2

CopyItems方法可能复制多个项目。因此,您一开始就错误地寻找单个文件名。这是一个非常复杂的 API,您确实需要仔细阅读文档并清楚地了解该函数的工作原理。

psiDestinationFolder参数是一个IShellItem标识目的地的参数。使用GetDisplayName方法获取文件路径。

另一个参数,punkItems更复杂。它是这样记录的:

指向 IShellItemArray、IDataObject 或 IEnumShellItems 对象的 IUnknown 的指针,该对象表示要复制的项目组。您还可以指向 IPersistIDList 对象来表示单个项目,从而有效地完成与 IFileOperation::CopyItem 相同的功能。

这告诉您在您收到的接口后面可能有一个IShellItemArrayIDataObjectIEnumShellItems一个对象。并且该单个对象中可能有多个项目,每个项目都将复制到目标文件夹。您将需要依次查询每个可能的接口,直到找出您必须处理的这些可能性中的哪一个。然后用特殊代码处理每一个。为了测试这一点,您需要编写调用每个可能接口的代码。您将从四个接口中的每一个的文档中了解如何执行所有这些操作。如果您还不太了解 shell 编程和 COM,那么在您完成这项工作时就应该知道了。IPersistIDListIUnknownpunkItemsCopyItems

最后,我怀疑这是检测文件复制的一种非常好的方法。使用许多不同的 API 复制文件。而且IFileOperation.CopyItems只是其中之一。如果你只钩子IFileOperation.CopyItems,那么你会错过很多文件复制操作。

于 2014-07-17T12:03:53.760 回答