从IfileOperation.GetDisplayName中的IShellItem获取文件名

时间:2014-07-17 08:54:35

标签: shell delphi com shfileoperation

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

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

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

打扰一下,如果我的英语不好!

1 个答案:

答案 0 :(得分:2)

CopyItems方法可能会复制多个项目。所以马上你就错了,寻找一个文件名。这是一个非常复杂的API,您需要仔细阅读documentation并清楚地了解该函数的工作原理。

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

另一个参数punkItems更复杂。它记录如下:

  

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

这告诉您,您收到的IShellItemArray界面后面可能有IDataObjectIEnumShellItemsIPersistIDListIUnknown个对象。并且该单个对象中可能有多个项目,每个项目都要复制到目标文件夹。您需要依次查询punkItems每个可能的界面,直到找到您必须处理的这些可能性中的哪一个。然后用特殊代码处理每一个。为了测试这一点,您需要编写使用每个可能接口调用CopyItems的代码。您将从四个接口中的每一个的文档中找到如何完成所有这些操作。如果您还不熟悉shell编程和COM,那么在完成这项工作之前,请务必这样做。

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