win32打开文件或执行程序(ShellExecute和ShellExecuteEx) ShellExecuteHINSTANCE ShellExecuteA( [in, optional] HWND hwnd, // 对应窗口句柄 [in, optional] LPCSTR lpOperation, // 指定要操作的执行的动作 [in] LPCSTR lpFile, // 指定要执行的文件或对象 [in, optional] LPCSTR lpParameters, // 指定可执行参数或文档文档 [in, optional] LPCSTR lpDirectory, // 指定工作目录 [in] INT nShowCmd // 如何显示应用程序的标志 );lpOperation值含义edit启动编辑器并打开文档进行编辑explore浏览由lpFile指定的文件夹find从 lpDirectory指定的目录中启动搜索open打开由 lpFile 参数指定的项print打印由 lpFile指定的文件runas以管理员身份启动应用程序NULL默认值 verbnShowCmd值含义SW_HIDE0隐藏窗口并激活另一个窗口。SW_SHOWNORMALSW_NORMAL1激活并显示窗口。 如果窗口最小化、最大化或排列系统会将其还原到其原始大小和位置。 应用程序应在首次显示窗口时指定此标志。SW_SHOWMINIMIZED2激活窗口并将其显示为最小化窗口。SW_SHOWMAXIMIZEDSW_MAXIMIZE3激活窗口并显示最大化的窗口。SW_SHOWNOACTIVATE4以最近的大小和位置显示窗口。 此值类似于SW_SHOWNORMAL只是窗口未激活。SW_SHOW5激活窗口并以当前大小和位置显示窗口。SW_MINIMIZE6最小化指定的窗口并按 Z 顺序激活下一个顶级窗口。SW_SHOWMINNOACTIVE7将窗口显示为最小化窗口。 此值类似于SW_SHOWMINIMIZED但窗口未激活。SW_SHOWNA8以当前大小和位置显示窗口。 此值类似于SW_SHOW只是窗口未激活。SW_RESTORE9激活并显示窗口。 如果窗口最小化、最大化或排列系统会将其还原到其原始大小和位置。 还原最小化窗口时应用程序应指定此标志。SW_SHOWDEFAULT10根据启动应用程序的程序传递给 CreateProcess 函数的 STARTUPINFO 结构中指定的SW_值设置显示状态。SW_FORCEMINIMIZE11最小化窗口即使拥有窗口的线程没有响应。 仅当最小化不同线程的窗口时才应使用此标志。返回值返回代码描述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_DDEFAILDDE 事务失败。SE_ERR_DDETIMEOUT无法完成 DDE 事务因为请求超时。SE_ERR_DLLNOTFOUND找不到指定的 DLL。SE_ERR_FNF找不到指定的文件。SE_ERR_NOASSOC没有与给定文件扩展名关联的应用程序。 如果尝试打印不可打印的文件也会返回此错误。SE_ERR_OOM没有足够的内存来完成操作。SE_ERR_PNF找不到指定的路径。SE_ERR_SHARE发生共享冲突。ShellExecuteExBOOL ShellExecuteExA( [in, out] SHELLEXECUTEINFOA *pExecInfo // 包含并接收有关正在执行的应用程序的信息 );SHELLEXECUTEINFOtypedef struct _SHELLEXECUTEINFOA { DWORD cbSize; // 必填。结构的大小 ULONG fMask; // 标识位详细看下文 HWND hwnd; // 对应窗口句柄 LPCSTR lpVerb; // 指定要执行的动作详细看下文 LPCSTR lpFile; // 指定的操作的文件或对象的名称 LPCSTR lpParameters; // 包含应用程序参数 或 NULL LPCSTR lpDirectory; // 指定工作目录地址 int nShow; // 指定在打开应用程序时如何显示应用程序的标志 HINSTANCE hInstApp; // 错误码 void *lpIDList; // 唯一标识要执行的文件的项标识符列表由fMask的 SEE_MASK_IDLIST 或 SEE_MASK_INVOKEIDLIST 控制 LPCSTR lpClass; // 绑定的类名(待分析)由fMask的 SEE_MASK_CLASSNAME 控制 HKEY hkeyClass; // 注册表项句柄由fMask的 SEE_MASK_CLASSKEY 控制 DWORD dwHotKey; // 键盘快捷方式由fMask的 SEE_MASK_HOTKEY 控制 union { // 可自定义单元 HANDLE hIcon; // 文件类型图标的句柄由fMask的SEE_MASK_ICON控制 HANDLE hMonitor; // 要显示文档的监视器的句柄SEE_MASK_HMONITOR控制 } DUMMYUNIONNAME; HANDLE hProcess; // 新启动应用程序的句柄由SEE_MASK_NOCLOSEPROCESS控制否则一般为NULL } SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;fMask以下一个或多个值的组合这些值指示其他结构成员的内容和有效性。值含义SEE_MASK_DEFAULT0x00000000使用默认值。SEE_MASK_CLASSNAME0x00000001使用由lpClass成员提供的类名。 如果同时设置了SEE_MASK_CLASSKEY和SEE_MASK_CLASSNAME则使用类键。SEE_MASK_CLASSKEY0x00000003使用由hkeyClass成员提供的类键。 如果同时设置了SEE_MASK_CLASSKEY和SEE_MASK_CLASSNAME则使用类键。SEE_MASK_IDLIST0x00000004使用由lpIDList成员提供的项标识符列表。lpIDList成员必须指向 ITEMIDLIST 结构。SEE_MASK_INVOKEIDLIST 0x0000000C使用选定项 快捷菜单处理程序的 IContextMenu 接口。 使用lpFile按文件系统路径标识项或者使用lpIDList按其 PIDL 标识项。 此标志允许应用程序使用 ShellExecuteEx 从快捷菜单扩展而不是注册表中列出的静态verbs调用verbs。注意SEE_MASK_INVOKEIDLIST 重写并暗示SEE_MASK_IDLIST。SEE_MASK_ICON0x00000010使用由hIcon成员提供的图标。 此标志不能与SEE_MASK_HMONITOR结合使用。注意此标志仅在 Windows XP 及更早版本中使用。 从 Windows Vista 开始它将被忽略。SEE_MASK_HOTKEY0x00000020使用由dwHotKey成员提供的键盘快捷方式。SEE_MASK_NOCLOSEPROCESS0x00000040用于指示hProcess成员接收进程句柄。 此句柄通常用于允许应用程序确定何时使用 ShellExecuteEx 终止创建的进程。 在某些情况下例如通过 DDE 会话满足执行时不会返回句柄。 调用应用程序负责在不再需要句柄时关闭句柄。SEE_MASK_CONNECTNETDRV0x00000080验证共享并连接到驱动器号。 这样就可以重新连接断开连接的网络驱动器。lpFile成员是网络上文件的 UNC 路径。SEE_MASK_NOASYNC0x00000100等待执行操作完成然后再返回。 此标志应由使用 ShellExecute 表单的调用方使用这些表单可能会导致异步激活例如 DDE并创建可能在后台线程上运行的进程。 注意ShellExecuteEx 默认在后台线程上运行如果调用方线程模型不是 Apartment。从在后台线程上运行的进程调用ShellExecuteEx应始终传递此标志。 此外调用ShellExecuteEx后立即退出的应用程序应指定此标志。如果在后台线程上执行执行操作并且调用方未指定SEE_MASK_ASYNCOK标志则调用线程将等到新进程启动后才返回。 这通常意味着已调用 CreateProcess、DDE 通信已完成或者自定义执行委托已通知 ShellExecuteEx 已完成。 如果指定了SEE_MASK_WAITFORINPUTIDLE标志ShellExecuteEx调用 WaitForInputIdle并在返回前等待新进程空闲最大超时为 1 分钟。有关何时需要此标志的进一步讨论请参阅“备注”部分。SEE_MASK_FLAG_DDEWAIT0x00000100与SEE_MASK_NOASYNC相同首选使用此选项。SEE_MASK_DOENVSUBST0x00000200展开由lpDirectory或lpFile成员指定的字符串中指定的任何环境变量。SEE_MASK_FLAG_NO_UI0x00000400不要显示通常不带此选项的用户界面UI错误对话框。 安全提示将被免除但仍会显示。SEE_MASK_UNICODE0x00004000使用此标志指示 Unicode 应用程序。SEE_MASK_NO_CONSOLE0x00008000用于继承新进程的父主机而不是创建一个新控制台。 它与将 CREATE_NEW_CONSOLE 标志与 CreateProcess相反。SEE_MASK_ASYNCOK0x00100000可以在后台线程上执行执行调用应立即返回而无需等待后台线程完成。 请注意在某些情况下ShellExecuteEx 忽略此标志并等待进程在返回之前完成。SEE_MASK_NOQUERYCLASSSTORE0x01000000未使用。SEE_MASK_HMONITOR0x00200000在多监视器系统上指定监视器时使用此标志。 监视器在hMonitor成员中指定。 此标志不能与SEE_MASK_ICON结合使用。SEE_MASK_NOZONECHECKS0x00800000不执行区域检查。 此标志允许 ShellExecuteEx 绕过 IAttachmentExecute设置的区域检查。SEE_MASK_WAITFORINPUTIDLE0x02000000创建新进程后等待进程在返回之前处于空闲状态超时一分钟。 有关详细信息请参阅 WaitForInputIdle。SEE_MASK_FLAG_LOG_USAGE 0x04000000指示用户启动的启动该启动可跟踪常用程序和其他行为。SEE_MASK_FLAG_HINST_IS_SITE 0x08000000hInstApp成员用于指定实现 IServiceProvider的对象 IUnknown。 此对象将用作网站指针。 站点指针用于向 ShellExecute 函数、处理程序绑定进程和调用 verb 的处理程序提供服务。可以提供 ICreatingProcess以允许调用方更改正在创建的进程的某些参数。Windows 8 及更高版本中支持此标志。指定此选项后调用将在调用线程上同步运行。lpVerb值含义edit启动编辑器并打开文档进行编辑explore浏览 lpFile 指定的文件夹find从指定目录开始启动搜索open打开 由 lpFile 参数指定的文件openas启动“打开方式”对话框让用户选择一个应用以便打开 lpFile 参数指定的文件print打印lpFile指定的文档文件。properties显示文件或文件夹的属性runas以管理员身份启动应用程序。nshow等同于上文的nshowcmd声明若没有消息循环则需要设置SEE_MASK_NOASYNC若由消息循环需要保持一段时间则SEE_MASK_NOASYNC可选参考链接微软文档- ShellExecuteA 函数 shellapi.h - Win32 apps | Microsoft Learn微软文档- ShellExecuteExA 函数 shellapi.h - Win32 apps | Microsoft Learn微软文档-启动应用程序ShellExecute、ShellExecuteEx、SHELLEXECUTEINFO - Win32 apps | Microsoft Learn