今天来说说ShellExecuteEx这个函数,先翻译MSDN,然后看个例子。
ShellExecuteEx Function
对指定应用程序执行某个操作
语法:
BOOL ShellExecuteEx(
LPSHELLEXECUTEINFO lpExecInfo
);
参数:
lpExecInfo
[in, out] 一个指向 SHELLEXECUTEINFO 结构的指针,用来传递和保存应用程序执行相关的信息。
返回值:
如果函数成功执行就返回TRUE,否则返回 FALSE 。可调用 GetLastError 获取错误信息。
备注:
由于ShellExecuteEx 能够将执行委托给那些由组件对象模型COM激活的Shell 扩展(数据源,上下文菜单句柄,动词实现),因此在调用ShellExecuteEx 之前要先初始化 COM。某些Shell 扩展要求单线程单元模型的COM,在这种情况下,应当像下面一般初始化COM:
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)
在某些情况下 ShellExecuteEx 并没有使用这种类型的Shell 扩展,这时就无需初始化COM。虽然如此,总是在使用这个函数之前初始化COM是个不错的举措。
如果有多个显示器,并且你指定了一个HWND 同时设置lpExecInfo 的成员lpVerb 为 "Properties",那么由ShellExecuteEx 创建的任何窗口都有可能显示在不正确的位置上。
如果这个函数执行成功,它会设置 SHELLEXECUTEINFO 的hInstApp 成员为一个大于32的值。如果函数执行失败,hInstApp 成员被设置为SE_ERR_XXX(提示失败的原因)。虽然为了兼容16位的windows应用程序hInstApp 被声明成一个句柄,但它并不是一个句柄。它只能被转型为整数,并同32或SE_ERR_XXX之类的错误代码比较。
提供SE_ERR_XXX 之类的错误代码是为了兼容ShellExecute。使用GetLastError可以获得更详细的错误信息。返回值可以使下列之一:
Error | Description |
ERROR_FILE_NOT_FOUND | 指定文件不存在 |
ERROR_PATH_NOT_FOUND | 指定路径不存在 |
ERROR_DDE_FAIL | 动态数据交换 (DDE) 处理失败 |
ERROR_NO_ASSOCIATION | 没有与制定文件名扩展对应的应用程序 |
ERROR_ACCESS_DENIED | 访问指定文件被拒绝 |
ERROR_DLL_NOT_FOUND | 无法找到运行应用程序所必须的库文件 |
ERROR_CANCELLED | 这个函数要求用户提供更多其他信息(译注:比如弹出对话框),但请求用户被取消了 |
ERROR_NOT_ENOUGH_MEMORY | 没有足够的内存来执行操作 |
ERROR_SHARING_VIOLATION | 共享违规发生了 |
Windows 95/98/Me: ShellExecuteEx 为Microsoft Layer for Unicode (MSLU)所支持。为了使用这个函数,必须添加额外的文件到应用程序中去,请参考:Microsoft Layer for Unicode on Windows Me/98/95 Systems.
函数信息:
Minimum DLL Version | shell32.dll version 3.51 or later |
Custom Implementation | No |
Header | shellapi.h |
Import library | shell32.lib |
Minimum operating systems | Windows NT 4.0, Windows 95 |
Unicode | Implemented as ANSI and Unicode versions |
下面举例说明如何使用这个函数,executePackage 这个函数用来执行某个应用程序。