SHELLEXECUTEINFOA 结构 (shellapi.h)

包含 ShellExecuteEx使用的信息。

语法

typedef struct _SHELLEXECUTEINFOA {
  DWORD     cbSize;
  ULONG     fMask;
  HWND      hwnd;
  LPCSTR    lpVerb;
  LPCSTR    lpFile;
  LPCSTR    lpParameters;
  LPCSTR    lpDirectory;
  int       nShow;
  HINSTANCE hInstApp;
  void      *lpIDList;
  LPCSTR    lpClass;
  HKEY      hkeyClass;
  DWORD     dwHotKey;
  union {
    HANDLE hIcon;
    HANDLE hMonitor;
  } DUMMYUNIONNAME;
  HANDLE    hProcess;
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;

成员

cbSize

类型:DWORD

必填。 此结构的大小(以字节为单位)。

fMask

类型:ULONG

以下一个或多个值的组合,这些值指示其他结构成员的内容和有效性:

SEE_MASK_DEFAULT(0x00000000) 使用默认值。
SEE_MASK_CLASSNAME(0x00000001) 使用由 lpClass 成员提供的类名。 如果同时设置了SEE_MASK_CLASSKEY和SEE_MASK_CLASSNAME,则使用类键。
SEE_MASK_CLASSKEY(0x00000003) 使用由 hkeyClass 成员提供的类键。 如果同时设置了SEE_MASK_CLASSKEY和SEE_MASK_CLASSNAME,则使用类键。
SEE_MASK_IDLIST(0x00000004) 使用由 lpIDList 成员提供的项标识符列表。 lpIDList 成员必须指向 ITEMIDLIST 结构。
SEE_MASK_INVOKEIDLIST (0x0000000C) 使用选定项 快捷菜单处理程序IContextMenu 接口。 使用 lpFile 按文件系统路径标识项,或者使用 lpIDList 按其 PIDL 标识项。 此标志允许应用程序使用 ShellExecuteEx 从快捷菜单扩展(而不是注册表中列出的静态谓词)调用谓词。
注意: SEE_MASK_INVOKEIDLIST 重写并暗示SEE_MASK_IDLIST。
SEE_MASK_ICON(0x00000010) 使用由 hIcon 成员提供的图标。 此标志不能与SEE_MASK_HMONITOR结合使用。
注意: 此标志仅在 Windows XP 及更早版本中使用。 从 Windows Vista 开始,它将被忽略。
SEE_MASK_HOTKEY(0x00000020) 使用由 dwHotKey 成员提供的键盘快捷方式。
SEE_MASK_NOCLOSEPROCESS(0x00000040) 用于指示 hProcess 成员接收进程句柄。 此句柄通常用于允许应用程序确定何时使用 ShellExecuteEx 终止创建的进程。 在某些情况下,例如通过 DDE 会话满足执行时,不会返回句柄。 调用应用程序负责在不再需要句柄时关闭句柄。
SEE_MASK_CONNECTNETDRV(0x00000080) 验证共享并连接到驱动器号。 这样就可以重新连接断开连接的网络驱动器。 lpFile 成员是网络上文件的 UNC 路径。
SEE_MASK_NOASYNC(0x00000100) 等待执行操作完成,然后再返回。 此标志应由使用 ShellExecute 表单的调用方使用,这些表单可能会导致异步激活,例如 DDE,并创建可能在后台线程上运行的进程。 (注意:ShellExecuteEx 默认在后台线程上运行(如果调用方线程模型不是 Apartment)。从在后台线程上运行的进程调用 ShellExecuteEx 应始终传递此标志。 此外,调用 ShellExecuteEx 后立即退出的应用程序应指定此标志。

如果在后台线程上执行执行操作,并且调用方未指定SEE_MASK_ASYNCOK标志,则调用线程将等到新进程启动后才返回。 这通常意味着已调用 CreateProcess、DDE 通信已完成,或者自定义执行委托已通知 ShellExecuteEx 已完成。 如果指定了SEE_MASK_WAITFORINPUTIDLE标志,ShellExecuteEx 调用 WaitForInputIdle,并在返回前等待新进程空闲,最大超时为 1 分钟。

有关何时需要此标志的进一步讨论,请参阅“备注”部分。

SEE_MASK_FLAG_DDEWAIT(0x00000100) 与SEE_MASK_NOASYNC相同,首选使用此选项。
SEE_MASK_DOENVSUBST(0x00000200) 展开由 lpDirectorylpFile 成员指定的字符串中指定的任何环境变量。
SEE_MASK_FLAG_NO_UI(0x00000400) 不要显示通常不带此选项的用户界面(UI)错误对话框。 安全提示将被免除,但仍会显示。
SEE_MASK_UNICODE(0x00004000) 使用此标志指示 Unicode 应用程序。
SEE_MASK_NO_CONSOLE(0x00008000) 用于继承新进程的父主机,而不是创建一个新控制台。 它与将 CREATE_NEW_CONSOLE 标志与 CreateProcess相反。
SEE_MASK_ASYNCOK(0x00100000) 可以在后台线程上执行执行,调用应立即返回,而无需等待后台线程完成。 请注意,在某些情况下,ShellExecuteEx 忽略此标志,并等待进程在返回之前完成。
SEE_MASK_NOQUERYCLASSSTORE(0x01000000) 未使用。
SEE_MASK_HMONITOR(0x00200000) 在多监视器系统上指定监视器时使用此标志。 监视器在 hMonitor 成员中指定。 此标志不能与SEE_MASK_ICON结合使用。
SEE_MASK_NOZONECHECKS(0x00800000) 不执行区域检查。 此标志允许 ShellExecuteEx 绕过 IAttachmentExecute设置的区域检查。
SEE_MASK_WAITFORINPUTIDLE(0x02000000) 创建新进程后,等待进程在返回之前处于空闲状态,超时一分钟。 有关详细信息,请参阅 WaitForInputIdle
SEE_MASK_FLAG_LOG_USAGE (0x04000000) 指示用户启动的启动,该启动可跟踪常用程序和其他行为。
SEE_MASK_FLAG_HINST_IS_SITE (0x08000000) hInstApp 成员用于指定实现 IServiceProvider的对象 IUnknown。 此对象将用作网站指针。 站点指针用于向 ShellExecute 函数、处理程序绑定过程和调用谓词处理程序提供服务。

可以提供 ICreatingProcess,以允许调用方更改正在创建的进程的某些参数。

Windows 8 及更高版本中支持此标志。

指定此选项后,调用将在调用线程上同步运行。

hwnd

类型:HWND

自选。 所有者窗口的句柄,用于显示和定位系统在执行此函数时可能生成的任何 UI。

lpVerb

类型:LPCTSTR

一个字符串,称为 谓词,指定要执行的操作。 可用谓词集取决于特定文件或文件夹。 通常,对象快捷菜单中可用的操作是可用的谓词。 此参数可以 NULL,在这种情况下,将使用默认谓词(如果可用)。 如果没有,则使用“open”谓词。 如果两个谓词都不可用,系统将使用注册表中列出的第一个谓词。 除非有理由将操作限制为特定谓词,否则传递 NULL 以使用计算默认值。 在某些情况下,这是必需的,例如,指定SEE_MASK_FLAG_NO_UI,并且意图是生成“打开使用”UI(如果未安装任何应用)。

通常使用以下谓词:

  • 编辑:启动编辑器并打开文档进行编辑。 如果 lpFile 不是文档文件,则函数将失败。
  • 浏览:浏览由 lpFile指定的文件夹。
  • 查找:从指定目录开始启动搜索。
  • 打开:打开由 lpFile 参数指定的文件。 该文件可以是可执行文件、文档文件或文件夹。
  • openas:启动选取器 UI,允许用户选择打开由 lpFile 参数指定的文件的应用。
  • 打印:打印由 lpFile指定的文档文件。 如果 lpFile 不是文档文件,则函数将失败。
  • 属性:显示文件或文件夹的属性。
  • runas:以管理员身份启动应用程序。 用户帐户控制(UAC)将提示用户同意运行提升的应用程序,或输入用于运行应用程序的管理员帐户的凭据。

lpFile

类型:LPCTSTR

以 null 结尾的字符串的地址,该字符串指定 ShellExecuteEx 将对其执行由 lpVerb 参数指定的操作的文件或对象的名称。 ShellExecuteEx 函数支持的系统注册表谓词包括可执行文件和文档文件的“open”,以及已为其注册打印处理程序的文档文件的“print”。 其他应用程序可能已通过系统注册表添加了 Shell 谓词,例如 .avi 和.wav文件的“播放”。 若要指定 Shell 命名空间对象,请传递完全限定分析名称,并在 fMask 参数中设置 SEE_MASK_INVOKEIDLIST 标志。

注意: 如果设置了 SEE_MASK_INVOKEIDLIST 标志,则可以分别使用 lpFilelpIDList 来标识项的文件系统路径或其 PIDL。 必须设置两个值之一(lpFilelpIDList)。
注意: 如果名称中不包含路径,则假定当前目录。

lpParameters

类型:LPCTSTR

自选。 包含应用程序参数的以 null 结尾的字符串的地址。 参数必须用空格分隔。 如果 lpFile 成员指定文档文件,lpParametersNULL

lpDirectory

类型:LPCTSTR

自选。 指定工作目录名称的以 null 结尾的字符串的地址。 如果此成员 NULL,则当前目录将用作工作目录。

nShow

类型:int

必填。 指定在打开应用程序时如何显示应用程序的标志;ShellExecute 函数列出的SW_值之一。 如果 lpFile 指定文档文件,则标志将直接传递给关联的应用程序。 由应用程序决定如何处理它。

hInstApp

类型:HINSTANCE

[out]如果设置了SEE_MASK_NOCLOSEPROCESS并且 ShellExecuteEx 调用成功,则会将此成员设置为大于 32 的值。 如果函数失败,则会将其设置为指示失败原因的SE_ERR_XXX错误值。 尽管 hInstApp 声明为 HINSTANCE,以便与 16 位 Windows 应用程序兼容,但它不是真正的 HINSTANCE。 它只能强制转换为 int,并且与以下 32 个或以下SE_ERR_XXX错误代码进行比较。


错误代码 原因
SE_ERR_FNF (2) 找不到文件。
SE_ERR_PNF (3) 找不到路径。
SE_ERR_ACCESSDENIED (5) 访问被拒绝。
SE_ERR_OOM (8) 内存不足。
SE_ERR_DLLNOTFOUND (32) 找不到动态链接库。
SE_ERR_SHARE (26) 无法共享打开的文件。
SE_ERR_ASSOCINCOMPLETE (27) 文件关联信息未完成。
SE_ERR_DDETIMEOUT (28) DDE 操作超时。
SE_ERR_DDEFAIL (29) DDE 操作失败。
SE_ERR_DDEBUSY (30) DDE 操作正忙。
SE_ERR_NOASSOC (31) 文件关联不可用。

lpIDList

类型:LPVOID

绝对 ITEMIDLIST 结构(PCIDLIST_ABSOLUTE)的地址,以包含唯一标识要执行的文件的项标识符列表。 如果 fMask 成员不包含 SEE_MASK_IDLISTSEE_MASK_INVOKEIDLIST,则忽略此成员。

lpClass

类型:LPCTSTR

以 null 结尾的字符串的地址,指定下列值之一:

  • ProgId。 例如,“Paint.Picture”。
  • URI 协议方案。 例如,“http”。
  • 文件扩展名。 例如,“.txt”。
  • HKEY_CLASSES_ROOT下的注册表路径,用于命名包含一个或多个 Shell 谓词的子项。 此键将具有符合 Shell 谓词注册表架构的子项,例如 shell\谓词名称

如果 fMask 不包括 SEE_MASK_CLASSNAME,则忽略此成员。

hkeyClass

类型:HKEY

文件类型的注册表项句柄。 此注册表项的访问权限应设置为KEY_READ。 如果 fMask 不包括 SEE_MASK_CLASSKEY,则忽略此成员。

dwHotKey

类型:DWORD

与应用程序关联的键盘快捷方式。 低序字是虚拟键代码,高阶单词是修饰符标志(HOTKEYF_)。 有关修饰符标志的列表,请参阅 WM_SETHOTKEY 消息的说明。 如果 fMask 不包括 SEE_MASK_HOTKEY,则忽略此成员。

DUMMYUNIONNAME

DUMMYUNIONNAME.hIcon

类型:HANDLE

文件类型图标的句柄。 如果 fMask 不包括 SEE_MASK_ICON,则忽略此成员。 此值仅在 Windows XP 及更早版本中使用。 从 Windows Vista 开始,它将被忽略。

DUMMYUNIONNAME.hMonitor

类型:HANDLE

要显示文档的监视器的句柄。 如果 fMask 不包括 SEE_MASK_HMONITOR,则忽略此成员。

hProcess

类型:HANDLE

新启动应用程序的句柄。 此成员在返回时设置,并且始终 NULL,除非 fMask 设置为 SEE_MASK_NOCLOSEPROCESS。 即使 fMask 设置为 SEE_MASK_NOCLOSEPROCESS,如果未启动进程,hProcess 也会 NULL。 例如,如果要启动的文档是 URL,并且 Internet Explorer 的实例已经运行,则会显示该文档。 未启动新进程,hProcessNULL

注意:ShellExecuteEx 并不总是返回 hProcess,即使调用结果启动进程也是如此。 例如,使用 SEE_MASK_INVOKEIDLIST 调用 IContextMenu时,hProcess 不会返回。

言论

如果调用 ShellExecuteEx 的线程没有消息循环,或者线程或进程将在 ShellExecuteEx 返回后不久终止,则必须指定 SEE_MASK_NOASYNC 标志。 在这种情况下,调用线程将无法完成 DDE 对话,因此在将控制权返回到调用应用程序之前,ShellExecuteEx 完成会话非常重要。 未能完成对话可能会导致文档启动失败。

如果调用线程具有消息循环,并在调用 ShellExecuteEx 返回后存在一段时间,则 SEE_MASK_NOASYNC 标志是可选的。 如果省略该标志,则调用线程的消息泵将用于完成 DDE 对话。 调用应用程序会更快地重新获得控制权,因为可以在后台完成 DDE 对话。

若要在 lpParameters中包含双引号,请将每个标记括在一对引号中,如以下示例所示。

sei.lpParameters = "An example: \"\"\"quoted text\"\"\"";

在这种情况下,应用程序接收三个参数:示例:“带引号的文本”

注意

shellapi.h 标头将 SHELLEXECUTEINFO 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非中性编码别名与非非编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
标头 shellapi.h