WinApi ShellExecuteEx - 在文件列表上使用动词“复制”

Posted

技术标签:

【中文标题】WinApi ShellExecuteEx - 在文件列表上使用动词“复制”【英文标题】:WinApi ShellExecuteEx - using verb 'copy' on a file list 【发布时间】:2011-04-26 09:35:09 【问题描述】:

是否可以使用 ShellExecuteEx 复制或剪切给定目录中的一组文件? Windows 功能在单个文件上运行良好,但我在任何地方都找不到有关该主题的任何提示(带有文件列表)。

我不希望有任何替代方法(例如 xcopy),因为在执行特定于 shell 项的操作后,我需要 windows shell 功能撤消/重做。

Microsoft msdn 库中根本没有记录。我试图用诸如 PChar("Drive:\file1.fileExt","Drive:\file1.fileExt") 和其他此类常见列表格式的项目列表填充 'lpfile' 参数......但没有做,shellExecuteEx 返回一个值

是否有诸如“select”或“addtoselection”之类的动词? 是否应该添加 SEE_MASK_IDLIST 标志,在这种情况下是一个 ITEMIDLIST 结构 能否定义一个将在其上执行 ShellExecuteEx 动词的文件列表?

【问题讨论】:

【参考方案1】:

是的,这是可能的,但如果 Windows API 有内置函数来执行此操作,为什么还要执行外部命令呢?对于复制/剪切操作,我建议您使用SHFileOperation(),微软为此提供了code example。

或者,您也可以使用CopyFileEx() 复制文件,并使用MoveFile() 移动文件。它们比SHFileOperation() 更快。

【讨论】:

好的,这里有一个如何使用ShellExecuteEx() 的例子http://msdn.microsoft.com/en-us/library/bb776886(VS.85).aspx#example,但是如果ShellExecute() 对你的情况来说已经足够了,你应该改用它,因为它的开销更少(所以它是更快)。【参考方案2】:

你是对的,SHFileOperation 使用起来非常简单(与 shellexexuteex 相比),但是这个函数的行为有点不同。如果您在应用程序中执行 SHFileOperation(例如复制或剪切),如果您直接返回 Windows 资源管理器,则“粘贴”上下文菜单项不可用。似乎 shell 以另一种方式运行,而不是使用 wellexecuteex。通过在应用程序中执行 ShellExecuteEx 并分离单个文件,资源管理器可以直接启用“粘贴”项。

无论如何,WinApi/ShellApi 对此并不是很清楚,因为总的来说有很多方法可以复制文件: - 带有动词“复制”的 SHellExecuteEx - SHFileOperation - 剪贴板:模拟文件放置事件时...

但在任何方面,撤消/重做 shell 上下文项的行为都类似于资源管理器进程。 - ShellExecuteEx 很好地启用了撤消/重做功能,但仅对单个文件进行操作(或未记录) - SHFileOperation 可以在文件列表上工作(正如您所说,用#0 分隔,结束列表是双#0。但 SHell 上下文菜单似乎没有像 ShellExecuteEx 那样深入地链接到操作。 - 剪贴板:也允许文件列表但不是所有行为(仅复制,不粘贴)。因为“粘贴”似乎更像是一种拖放移动操作,而不是剪贴板操作,即使 ShellApi 指定它有点相同......他们使用的是其他任何地方都没有使用的特殊结构......

综合:一点都不清楚。 windows api 提供了至少 3 种操作文件的方式,但如果我们谈论文件列表,它就不那么合乎逻辑了,甚至是一场噩梦:你必须处理除了微软的 3 个仍在工作的人之外没有人使用的旧结构处理 shell 功能...(或不处理)。

【讨论】:

以上是关于WinApi ShellExecuteEx - 在文件列表上使用动词“复制”的主要内容,如果未能解决你的问题,请参考以下文章

ShellExecuteEx 并等待文件实际打开

为啥 ShellExecuteEx 不返回进程句柄?

将 unicode 参数传递给 ShellExecuteEx 中的子进程

VC++分别使用WinExecCreateProcessShellExecute和ShellExecuteEx来启动程序(附源码)

Windows函数 ShellExecuteEx

ShellExecuteEx函数的作用