在Windows中调用外部应用程序是一种必不可少的方式,例如打开一个文档或者执行一个命令行程序。而Shellexecuteex函数是一种常见的方法,它提供了一种简单而灵活的方式来实现这一目的。在本文中,我们将会介绍Shellexecuteex函数的基本知识以及一些常见的用法。
一、Shellexecuteex函数的定义和语法
Shellexecuteex函数的定义如下:
BOOL ShellExecuteEx(
_Inout_ LPSHELLEXECUTEINFO lpExecInfo
);
其中,lpExecInfo参数是一个指向SHELLEXECUTEINFO的结构体指针,这个结构体的定义包含了调用外部应用程序所需的所有信息。SHELLEXECUTEINFO结构体的定义如下:
typedef struct _SHELLEXECUTEINFOA {
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCSTR lpVerb;
LPCSTR lpFile;
LPCSTR lpParameters;
LPCSTR lpDirectory;
INT nShow;
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
这个结构体中包含了很多信息,其中cbSize和fMask是必填项。cbSize保存了SHELLEXECUTEINFO结构体的大小,fMask保存了可以改变SHELLEXECUTEINFO结构体中的哪些字段。其他的字段包括:
·hwnd:应用程序窗口的句柄;
·lpVerb:操作的动态链接库(DLL)文件名称;
·lpFile:应用程序文件的名称;
·lpParameters:命令行参数;
·lpDirectory:应用程序的工作目录;
·nShow:应用程序窗口的显示状态;
·hInstApp:Shellexecuteex函数调用之前运行的应用程序的句柄;
·lpIDList:包含缩略图图像数据的ITEM_IDLIST结构体指针;
·lpClass:文件的类型名称;
·hkeyClass:注册表项句柄;
·dwHotKey:热键值;
·DUMMYUNIONNAME:联合体类型;
·hProcess:应用程序的进程句柄。
在Shellexecuteex函数的调用过程中,必须提供lpFile和lpParameters两个参数。lpFile参数指定了要执行的应用程序文件的名称,而lpParameters参数指定在启动应用程序时将传递的命令行参数。一些可选的参数包括hwnd、lpVerb、lpDirectory、nShow和hInstApp等。
标准的Shellexecuteex函数定义在shellapi.h文件中,通常作为Windows API的一部分提供。Shellexecuteex函数还有其他的变体,这些变体可以支持更多的参数类型和选项。例如,ShellExecuteExA和ShellExecuteExW函数可以使用ANSI和Unicode字符串,而ShellExecuteExForContextMenu可以在上下文菜单中使用。我们可以选择这些变体中的任何一种,具体取决于我们的需求。
二、Shellexecuteex函数的调用方法
与其他Windows API一样,我们可以通过各种编程语言调用Shellexecuteex函数。以下是一段使用C++的示例代码:
#include
#include
int main()
{
SHELLEXECUTEINFO shExInfo = { 0 };
shExInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shExInfo.hwnd = NULL;
shExInfo.lpVerb = NULL;
shExInfo.lpFile = "C:\\Windows\\notepad.exe";
shExInfo.lpParameters = "C:\\test.txt";
shExInfo.lpDirectory = NULL;
shExInfo.nShow = SW_SHOW;
shExInfo.hInstApp = NULL;
ShellExecuteEx(&shExInfo);
return 0;
}
在上面的代码中,首先定义了一个SHELLEXECUTEINFO结构体变量shExInfo,然后对这个结构体进行了一些初始化。最后,调用ShellExecuteEx函数来执行指定的程序。在这个例子中,我们使用notepad.exe程序打开test.txt文件。
三、Shellexecuteex函数的返回值和错误处理
Shellexecuteex函数的返回值是一个布尔值,指示函数是否成功执行。如果函数成功执行,则返回值为TRUE;否则,返回值为FALSE。此外,Shellexecuteex函数还会在SHELLEXECUTEINFO结构体的hProcess字段中返回启动程序的进程句柄。
当Shellexecuteex函数返回FALSE时,我们需要检查错误代码以确定发生了什么错误。可以使用GetLastError函数获取最后一个错误代码。
以下是一些常见的错误代码及其相应的原因:
·ERROR_FILE_NOT_FOUND:指定的文件不存在;
·ERROR_PATH_NOT_FOUND:指定的路径不存在;
·ERROR_BAD_FORMAT:指定的文件不是有效的Win32应用程序;
·ERROR_ACCESS_DENIED:访问被拒绝;
·ERROR_INVALID_PARAMETER:指定的参数无效。
我们可以根据这些错误代码中的一种或多种来诊断Shellexecuteex函数中的问题。
四、Shellexecuteex函数的用途
Shellexecuteex函数是一个非常有用的API函数,可以用于各种任务。以下是一些常见的用途:
·打开文档:使用Shellexecuteex函数可以打开各种文档类型,例如Word文档、Excel表格、PDF文档等;
·执行命令行程序:可以使用Shellexecuteex函数从我们的程序中执行命令行程序,这对于执行脚本非常有用;
·打开网页:使用Shellexecuteex函数可以打开浏览器并浏览指定的网页;
·显示文件夹:可以使用Shellexecuteex函数打开Windows中的文件夹;
·使用默认程序打开文件:使用Shellexecuteex函数可以根据文件的类型自动选择正确的程序打开文件。
总之,Shellexecuteex函数是一种常见而强大的方式来调用外部应用程序。我们可以使用它来打开文档、执行命令行程序、显示文件夹等。正如我们在本文中所看到的,Shellexecuteex函数是可定制的,可以使用各种参数来满足不同的需求。此外,使用Shellexecuteex函数,在应用程序中执行外部程序也非常简单。