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 - 在文件列表上使用动词“复制”的主要内容,如果未能解决你的问题,请参考以下文章
将 unicode 参数传递给 ShellExecuteEx 中的子进程
VC++分别使用WinExecCreateProcessShellExecute和ShellExecuteEx来启动程序(附源码)