【问题标题】:How to use SHOpenFolderAndSelectItems without selecting items?如何在不选择项目的情况下使用 SHOpenFolderAndSelectItems?
【发布时间】:2014-03-11 00:54:33
【问题描述】:

我正在使用SHOpenFolderAndSelectItems 来打开一个显示特定位置的新资源管理器窗口 (PIDL)。我对只打开文件路径不感兴趣,所以据我所知我需要使用 PIDL

这可行,但是,我对选择窗口中的任何项目都不感兴趣。如果我没有传递任何要选择的项目,则会根据文档打开父文件夹:

选择数组中的项目计数,apidl。如果 cidl 为零,则 pidlFolder 必须指向一个完全指定的 ITEMIDLIST,描述一个 要选择的单个项目。此函数打开父文件夹并 选择该项目。

我怎样才能简单地打开我通过的 PIDL 指向的位置?

作为测试,我通过了一个要选择的项目,指向一个空指针。这似乎有效,但我担心这可能会产生意想不到的副作用。这种行为似乎没有记录。有没有更好的方法来实现我想要实现的目标,或者我现在使用此功能的方式是否正确?

【问题讨论】:

  • 我通常使用特定的命令行参数来启动 explorer.exe。参见例如 support.microsoft.com/kb/152457 。请注意,对于 root 或 select 的逗号前后没有空格是非常坚持的。
  • 如果只是想打开文件夹,只需ShellExecute即可。
  • @RaymondChen 我在ShellExecute 文档中没有看到任何提及 PIDL。我还需要能够打开虚拟文件夹。
  • @MicroVirus In order to open a PIDL through the command line 我必须将 PIDL 推入共享内存 which seems deprecated
  • ShellExecute 是“您传递给ShellExecuteExSHELLEXECUTEINFO 结构的lpIDList 成员”的简写。很抱歉留下了Ex

标签: winapi windows-shell


【解决方案1】:

SHOpenFolder**AndSelectItems**() 应该很好地表明这是您使用的错误函数。如果只想打开文件夹,请改用ShellExecuteEx(),例如:

SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(sei);
sei.fMaask = SEE_MASK_IDLIST;
sei.hwnd = ...;
sei.lpVerb = TEXT("explore"); // <-- not "open"
sei.lpIDList = ...; // <-- your pidl
sei.nShow = SW_SHOW;

ShellExecuteEx(&sei);

【讨论】:

  • +1。 @Remy Lebeau:ShellExecuteEx 支持 pidl,如果我没记错的话。
  • 该问题专门询问 PIDL。我知道如何打开路径,但并非所有 PIDL 都指向路径...
  • @Xearinox 来自a quick look at the documentation,这似乎是答案。如果您发布它,我会在我尝试后接受。
  • @Xearinox: ShellExecute() 不支持 PIDL,但 ShellExecuteEx() 支持。我已经相应地更新了我的答案。
  • @StevenJeuris:你必须使用 explore 动词,而不是 open 动词。
猜你喜欢
  • 1970-01-01
  • 2011-05-02
  • 2015-02-23
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多