该CopyItems
方法可能复制多个项目。因此,您一开始就错误地寻找单个文件名。这是一个非常复杂的 API,您确实需要仔细阅读文档并清楚地了解该函数的工作原理。
psiDestinationFolder
参数是一个IShellItem
标识目的地的参数。使用GetDisplayName
方法获取文件路径。
另一个参数,punkItems
更复杂。它是这样记录的:
指向 IShellItemArray、IDataObject 或 IEnumShellItems 对象的 IUnknown 的指针,该对象表示要复制的项目组。您还可以指向 IPersistIDList 对象来表示单个项目,从而有效地完成与 IFileOperation::CopyItem 相同的功能。
这告诉您在您收到的接口后面可能有一个IShellItemArray
、IDataObject
或IEnumShellItems
一个对象。并且该单个对象中可能有多个项目,每个项目都将复制到目标文件夹。您将需要依次查询每个可能的接口,直到找出您必须处理的这些可能性中的哪一个。然后用特殊代码处理每一个。为了测试这一点,您需要编写调用每个可能接口的代码。您将从四个接口中的每一个的文档中了解如何执行所有这些操作。如果您还不太了解 shell 编程和 COM,那么在您完成这项工作时就应该知道了。IPersistIDList
IUnknown
punkItems
CopyItems
最后,我怀疑这是检测文件复制的一种非常好的方法。使用许多不同的 API 复制文件。而且IFileOperation.CopyItems
只是其中之一。如果你只钩子IFileOperation.CopyItems
,那么你会错过很多文件复制操作。