ShellExecuteEx函数是Windows API的一部分,旨在启动一个新的进程或打开一个现有的进程。该函数允许用户指定要使用的应用程序、文档、资源管理器窗口等,以及指定如何在新的进程中打开它们。同时,ShellExecuteEx函数还可以传递参数、指定窗口风格以及在操作完成后获取信息。本文将。
一、ShellExecuteEx函数的基本使用方法
ShellExecuteEx函数的基本语法如下:
```c++
BOOL ShellExecuteEx(
LPSHELLEXECUTEINFO lpExecInfo
);
```
其中,lpExecInfo是一个指向SHELLEXECUTEINFO结构体的指针,用于指定要启动进程的参数和选项。以下是一个使用ShellExecuteEx函数打开一个txt文件的示例:
```c++
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "test.txt";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
if(!ShellExecuteEx(&ShExecInfo)) {
//启动进程失败
}
```
在以上代码中,SHELLEXECUTEINFO结构体中的参数选项如下:
1. cbSize:结构体的大小,用于指定可用的结构体成员。
2. fMask:一个标识位集合,用于指定一些启动选项。SEE_MASK_NOCLOSEPROCESS标识表示要保持进程的句柄。
3. hwnd:一个指向窗口的句柄,用于指定在该窗口的上下文中打开文件。
4. lpVerb:一个指向操作字符串的指针,用于执行操作(打开、查看、编辑等)。
5. lpFile:一个指向要启动的可执行文件或文档的路径和文件名。
6. lpParameters:一个指向传递给应用程序的命令行参数的字符串指针。
7. lpDirectory:启动进程的目录,当前目录为NULL。
8. nShow:默认窗口状态为SW_SHOW。
二、ShellExecuteEx函数打开新的应用程序
利用ShellExecuteEx函数可以打开新的应用程序,即启动一个新的进程。以下是打开Chrome浏览器的示例:
```c++
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
if(!ShellExecuteEx(&ShExecInfo)) {
//启动进程失败
}
```
在以上代码中,使用的是SEE_MASK_NOCLOSEPROCESS标识位,以便在后续操作中获取该进程的句柄。通过指定Chrome浏览器的执行路径“C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe”,我们可以在新进程中启动该浏览器。
三、利用ShellExecuteEx函数传递参数执行命令
ShellExecuteEx函数能够传递参数给新启动的进程,使其执行特定的操作。例如,我们可以利用ShellExecuteEx函数执行命令行命令,如下所示:
```c++
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "cmd.exe";
ShExecInfo.lpParameters = "/C echo Hello World!";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
if(!ShellExecuteEx(&ShExecInfo)) {
//启动进程失败
}
```
在以上示例中,指定要启动的可执行文件为cmd.exe,并将需要执行的命令传递给参数“/C echo Hello World!”。启动时将该字符串作为命令传递给cmd.exe进程,从而实现执行命令。
四、利用ShellExecuteEx函数调用外部应用程序
ShellExecuteEx函数还可以调用外部应用程序,例如打开媒体文件、电子邮件等应用程序。例如,我们可以利用ShellExecuteEx函数打开默认的邮件客户端:
```c++
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "open";
ShExecInfo.lpFile = "mailto:example@example.com";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
if(!ShellExecuteEx(&ShExecInfo)) {
//启动进程失败
}
```
在以上示例中,使用lpVerb参数指定要打开的“mailto:example@example.com"作为邮件链接,用于从默认的邮件客户端发送电子邮件。
五、ShellExecuteEx函数的实现方法
ShellExecuteEx函数是系统API,包含在Shell32.dll中。在执行之前,需要先关联并开启该库。以下是实现方法:
```c++
HINSTANCE hinstLib;
FARPROC lpfnShellExecuteEx;
hinstLib = LoadLibrary("Shell32.dll");
if (hinstLib != NULL) {
lpfnShellExecuteEx = GetProcAddress(hinstLib, "ShellExecuteExA");
if (lpfnShellExecuteEx != NULL) {
//调用ShellExecuteEx函数
} else {
//找不到ShellExecuteEx函数
}
} else {
//加载Shell32失败
}
```
在以上示例中,使用LoadLibrary函数加载Shell32.dll并使用GetProcAddress函数获取ShellExecuteEx函数的地址,从而调用ShellExecuteEx函数。
六、总结
本文主要介绍了ShellExecuteEx函数的多种用法和实现方法。使用ShellExecuteEx,可以执行一些常见的操作,如打开新的进程、传递参数、调用外部应用程序等等。需要注意的是,使用ShellExecuteEx函数时,需要正确设置SHELLEXECUTEINFO结构体中的参数和选项。