在Windows操作系统环境下,打开外部应用程序是一项必需的任务。而在程序中实现打开外部程序,可以使用Windows API shellexecuteinfo结构和ShellExecuteEx函数。本文将为读者介绍shellexecuteinfo结构和ShellExecuteEx函数的使用方法。
一、shellexecuteinfo结构
shellexecuteinfo结构是Windows API中用来打开外部应用程序的数据结构。它定义了在执行ShellExecuteEx函数时需要提供的一些参数。在Windows API中,shellexecuteinfo结构定义如下所示:
typedef struct _tagSHELLEXECUTEINFO{
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCTSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
HANDLE hIcon;
HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
其中,各参数的含义如下:
1. cbSize:表示SHELLEXECUTEINFO结构的字节数,可以通过sizeof()函数得到。
2. fMask:指定SHELLEXECUTEINFO结构中的某些参数是否有效,可以指定一个或多个标志位,主要有以下几个:
- SEE_MASK_NOCLOSEPROCESS:将hProcess成员指向ShellExecuteEx函数打开的进程句柄。
- SEE_MASK_INVOKEIDLIST:用于指定lpFile成员指定一个文件夹,打开文件夹选择对话框。
- SEE_MASK_FLAG_NO_UI:指定不显示任何对话框。
3. hwnd:指定ShellExecuteEx函数调用时的父窗口句柄,即打开应用程序的窗口所在的句柄。
4. lpVerb:指定打开操作的参数,例如“open”、“print”等。如果为空,则默认为“open”。
5. lpFile:指定要打开的文件的路径。如果使用ShellExecuteEx函数打开文件,则需要指定该参数。
6. lpParameters:指定传递给待运行程序的命令行参数。
7. lpDirectory:指定待运行程序的当前工作路径。
8. nShow:指定窗口的显示方式,取值如下:
- SW_HIDE(0):隐藏窗口并激活其他窗口。
- SW_SHOW(5):在原来的窗口位置显示窗口,并激活它。
- SW_MINIMIZE(6):将窗口最小化,并激活其他窗口。
- SW_MAXIMIZE(3):在最大化的状态下显示窗口。
- SW_RESTORE(9):将窗口还原到正常大小,并激活它。
9. hInstApp:指定打开的程序模块句柄。设计为运行参数,可以返回应用程序程序名。
10. lpIDList:指向指定的程序ID列表。
11. lpClass:指定文件类型的注册表路径。例如,“.txt”文件的lpClass为“txtfile”。
12. hkeyClass:指定打开文件的句柄。
13. dwHotKey:指定热键。
14. hIcon:指定应用程序图标的句柄。
15. hProcess:当SEE_MASK_NOCLOSEPROCESS标志位被指定时,hProcess成员指向ShellExecuteEx函数打开的进程句柄。
二、ShellExecuteEx函数
ShellExecuteEx函数是Windows API中的一个常用函数,它可以打开外部程序。 使用ShellExecuteEx函数时需要传递一个指向shellexecuteinfo结构的指针,同时函数的返回值是一个HRESULT类型的值。ShellExecuteEx函数的定义如下:
HINSTANCE ShellExecuteEx(
__inout LPSHELLEXECUTEINFO lpExecInfo
);
参数说明如下:
1. lpExecInfo:指向shellexecuteinfo结构的指针。
2. 返回值:S_OK表示函数调用成功,具体可以参考HRESULT。
ShellExecuteEx函数的返回值主要是使用HRESULT类型,该类型是一个32位的整数类型,表示函数执行结果的状态码,例如0x80070005表示函数无法读取文件或文件夹。其他常见的状态码如下:
- S_OK:操作成功完成。
- E_OUTOFMEMORY:内存不足。
- ERROR_FILE_NOT_FOUND:指定的文件不存在。
- ERROR_BAD_FORMAT:文件格式不支持。
- ERROR_CANCELLED:操作被取消。
- ERROR_BAD_PATHNAME:指定的路径无效。
- ERROR_NO_ASSOCIATION:找不到指定扩展名对应的注册表项。
- ERROR_ACCESS_DENIED:用户没有权限访问指定文件或目录。
三、使用ShellExecuteEx函数打开外部应用程序
1. 创建shellexecuteinfo结构
在使用ShellExecuteEx函数打开外部应用程序之前,我们需要先创建一个shellexecuteinfo结构。可以使用以下代码创建一个shellexecuteinfo结构:
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(sei));
sei.cbSize = sizeof(sei);
2. 指定shellexecuteinfo结构的参数
在创建完成shellexecuteinfo结构后,需要指定该结构的各参数。具体可以参考上文介绍的shellexecuteinfo结构的各参数含义。
例如,打开记事本“notepad.exe”应用程序的代码如下:
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpVerb = (LPCTSTR)L"open";
sei.lpFile = (LPCTSTR)L"notepad.exe";
sei.lpDirectory = (LPCTSTR)L"c:\\windows\\system32";
sei.nShow = SW_SHOW;
3. 调用ShellExecuteEx函数
在指定了shellexecuteinfo结构的各参数后,就可以调用ShellExecuteEx函数打开外部应用程序了。具体代码如下:
ShellExecuteEx(&sei);
4. 获取程序运行结果
如果您需要获取外部应用程序的运行结果,可以使用WaitForSingleObject函数等待ShellExecuteEx函数执行时打开的进程结束,并使用GetExitCodeProcess函数获取进程退出码。具体代码如下:
//等待进程结束
DWORD dwResult = WaitForSingleObject(sei.hProcess, INFINITE);
if (dwResult == WAIT_OBJECT_0)
{
DWORD dwExitCode = 0;
GetExitCodeProcess(sei.hProcess, &dwExitCode);
// 进程成功执行
}
至此,我们已经介绍了使用ShellExecuteEx函数打开外部应用程序的相关内容。使用ShellExecuteEx函数可以方便地打开外部应用程序,并且具有较高的灵活性和可扩展性,非常适合用于编写Windows应用程序。希望此文章对您有所帮助。