ShellExecuteA 函数 (shellapi.h)

对指定文件执行操作。

语法

HINSTANCE ShellExecuteA(
  [in, optional] HWND   hwnd,
  [in, optional] LPCSTR lpOperation,
  [in]           LPCSTR lpFile,
  [in, optional] LPCSTR lpParameters,
  [in, optional] LPCSTR lpDirectory,
  [in]           INT    nShowCmd
);

参数

[in, optional] hwnd

类型:HWND

用于显示 UI 或错误消息的父窗口的句柄。 如果操作未与窗口关联,则可以 NULL

[in, optional] lpOperation

类型:LPCTSTR

指向 null终止字符串的指针,在本例中称为 谓词,指定要执行的操作。 可用谓词集取决于特定文件或文件夹。 通常,对象快捷菜单中可用的操作是可用的谓词。 通常使用以下谓词:

编辑

启动编辑器并打开文档进行编辑。 如果 lpFile 不是文档文件,则函数将失败。

探讨

浏览由 lpFile指定的文件夹。

找到

lpDirectory指定的目录中启动搜索。

打开

打开由 lpFile 参数指定的项。 该项可以是文件或文件夹。

打印

打印由 lpFile指定的文件。 如果 lpFile 不是文档文件,则函数将失败。

runas

以管理员身份启动应用程序。 用户帐户控制(UAC)将提示用户同意运行提升的应用程序,或输入用于运行应用程序的管理员帐户的凭据。

如果使用默认谓词(如果可用)。 如果没有,则使用“open”谓词。 如果两个谓词都不可用,系统将使用注册表中列出的第一个谓词。

[in] lpFile

类型:LPCTSTR

指向 null终止字符串的指针,该字符串指定要对其执行指定谓词的文件或对象。 若要指定 Shell 命名空间对象,请传递完全限定分析名称。 请注意,并非所有谓词都支持所有对象。 例如,并非所有文档类型都支持“print”谓词。 如果将相对路径用于 lpDirectory 参数,则不对 lpFile使用相对路径。

[in, optional] lpParameters

类型:LPCTSTR

如果 lpFile 指定可执行文件,则此参数是指向 null终止字符串的指针,该字符串指定要传递给应用程序的参数。 此字符串的格式由要调用的谓词确定。 如果 lpFile 指定文档文件,lpParametersNULL

[in, optional] lpDirectory

类型:LPCTSTR

指向 null终止字符串的指针,该字符串指定操作的默认(工作)目录。 如果此值 NULL,则使用当前工作目录。 如果在 lpFile提供相对路径,请不要将相对路径用于 lpDirectory

[in] nShowCmd

类型:INT

指定在打开应用程序时如何显示应用程序的标志。 如果 lpFile 指定文档文件,则标志将直接传递给关联的应用程序。 由应用程序决定如何处理它。 它可以是 ShowWindow 函数的 nCmdShow 参数中指定的任何值。

返回值

类型:HINSTANCE

如果函数成功,则返回大于 32 的值。 如果函数失败,它将返回一个错误值,该值指示失败的原因。 返回值被强制转换为 HINSTANCE,以实现与 16 位 Windows 应用程序的向后兼容性。 然而,这不是真正的欣斯坦斯。 只能将其强制转换为 INT_PTR,并将其与下面的 32 或以下错误代码进行比较。

返回代码 描述
0
操作系统内存不足或资源。
ERROR_FILE_NOT_FOUND
找不到指定的文件。
ERROR_PATH_NOT_FOUND
找不到指定的路径。
ERROR_BAD_FORMAT
.exe 文件无效(.exe 映像中不存在 Win32 .exe 或错误)。
SE_ERR_ACCESSDENIED
操作系统拒绝访问指定文件。
SE_ERR_ASSOCINCOMPLETE
文件名关联不完整或无效。
SE_ERR_DDEBUSY
无法完成 DDE 事务,因为正在处理其他 DDE 事务。
SE_ERR_DDEFAIL
DDE 事务失败。
SE_ERR_DDETIMEOUT
无法完成 DDE 事务,因为请求超时。
SE_ERR_DLLNOTFOUND
找不到指定的 DLL。
SE_ERR_FNF
找不到指定的文件。
SE_ERR_NOASSOC
没有与给定文件扩展名关联的应用程序。 如果尝试打印不可打印的文件,也会返回此错误。
SE_ERR_OOM
没有足够的内存来完成操作。
SE_ERR_PNF
找不到指定的路径。
SE_ERR_SHARE
发生共享冲突。

调用 GetLastError 以获取扩展的错误信息。

言论

由于 ShellExecute 可以将执行委托给使用组件对象模型(COM)激活的 Shell 扩展(数据源、上下文菜单处理程序、谓词实现),因此应在调用 shellExecute 之前初始化 COM。 某些 Shell 扩展需要 COM 单线程单元 (STA) 类型。 在这种情况下,应初始化 COM,如下所示:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

当然,在某些情况下,ShellExecute 不使用这些类型的 Shell 扩展之一,并且这些实例根本不需要初始化 COM。 尽管如此,最好在使用此函数之前 始终 初始化 COM。

此方法允许你在文件夹的快捷菜单中执行任何命令或存储在注册表中。

若要打开文件夹,请使用以下任一调用:

ShellExecute(handle, NULL, <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);

ShellExecute(handle, "open", <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);

若要浏览文件夹,请使用以下调用:

ShellExecute(handle, "explore", <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);

若要为目录启动 Shell 的 Find 实用工具,请使用以下调用。

ShellExecute(handle, "find", <fully_qualified_path_to_folder>, NULL, NULL, 0);

如果 lpOperationNULL,则该函数将打开由 lpFile指定的文件。 如果 lpOperation 为“open”或“explore”,则函数将尝试打开或浏览文件夹。

若要获取由于调用 ShellExecute而启动的应用程序的信息,请使用 ShellExecuteEx

注释“文件夹选项”中单独的进程 设置中的 启动文件夹窗口会影响 ShellExecute。 如果禁用该选项(默认设置),ShellExecute 使用打开的资源管理器窗口,而不是启动新窗口。 如果未打开“资源管理器”窗口,ShellExecute 启动一个新窗口。
 

注意

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

要求

要求 价值
最低支持的客户端 Windows XP [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 shellapi.h
Shell32.lib
DLL Shell32.dll(版本 3.51 或更高版本)

另请参阅

CoInitializeEx

CreateProcessA

IShellExecuteHook

启动应用程序(ShellExecute、ShellExecuteEx、SHELLEXECUTEINFO)

ShellExecuteEx