在Windows操作系统中,想要执行外部程序可以采用多种途径:使用CreateProcess函数、ShellExecute函数,还可以使用shellexecuteinfo结构体。本文重点介绍如何使用shellexecuteinfo结构体来执行外部程序。
shellexecuteinfo结构体
shellexecuteinfo结构体是Windows API中一个比较常用的结构体,它的定义如下:
```
typedef struct _shellexecuteinfo {
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;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
```
从上面的定义可以看出,shellexecuteinfo结构体包含许多字段,这些字段决定了外部程序的执行方式。
具体来说,cbSize是结构体的大小,fMask指定结构体中哪些字段是有效的,hwnd是调用程序的窗口句柄,lpVerb是执行动作的字符串指针,lpFile是待执行程序的文件名或文档名,lpParameters是传递给待执行程序的命令行参数,lpDirectory是待执行程序的所在目录,nShow和hInstApp分别表示如何显示应用程序和输出实例的句柄。其他的字段可以忽略。
使用shellexecuteinfo结构体执行外部程序主要需要设置lpFile和lpParameters字段,这两个字段分别表示待执行程序的文件名和命令行参数。下面给出一个使用shellexecuteinfo结构体执行外部程序的示例:
```
#include
int main()
{
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
sei.lpFile = "notepad.exe";
sei.lpParameters = "test.txt";
sei.nShow = SW_SHOWNORMAL; // 显示窗口
::ShellExecuteEx(&sei);
return 0;
}
```
上述代码使用shellexecuteinfo结构体执行notepad.exe程序,并将test.txt文件作为参数传递给notepad.exe。在执行过程中,notepad.exe以正常窗口显示。
对于lpFile字段来说,可以指定任意可执行文件。如果所指定的文件不是可执行文件,shellexecuteinfo函数也会尝试用关联程序打开指定的文件。如果指定了不受支持的文件类型,则会尝试从注册表中取得默认的打开方式,如果默认打开方式也无法处理,则该函数将失败,可以通过函数返回值来判断是否失败。
关于命令行参数字段lpParameters,具体的传递方式要根据待执行程序自身来设计,可以参考执行待执行程序时所使用的参数。
需要注意的是,在使用shellexecuteinfo函数调用外部程序时,外部程序的行为是不可控的,因为它完全独立于原程序之外。如果外部程序由于某种异常情况而退出,或者将任务交给其他程序执行,控制权就可能无法返回到原程序。因此,使用shellexecuteinfo函数时需要小心谨慎。
总结
在Windows操作系统中,执行外部程序的方式多种多样,其中shellexecuteinfo结构体也是非常常用的一种方式。shellexecuteinfo结构体使用起来较为简便,只需要设置lpFile和lpParameters字段就可以完成外部程序的执行。但需要注意的是,使用shellexecuteinfo函数调用外部程序时,外部程序的行为是不可控的,需要谨慎处理。