了解Windows API shellexecuteinfo结构:使用ShellExecuteEx函数打开外部应用程序

作者:吴忠麻将开发公司 阅读:32 次 发布时间:2025-05-13 01:50:58

摘要:在Windows操作系统环境下,打开外部应用程序是一项必需的任务。而在程序中实现打开外部程序,可以使用Windows API shellexecuteinfo结构和ShellExecuteEx函数。本文将为读者介绍shellexecuteinfo结构和ShellExecuteEx函数的使用方法。...

在Windows操作系统环境下,打开外部应用程序是一项必需的任务。而在程序中实现打开外部程序,可以使用Windows API shellexecuteinfo结构和ShellExecuteEx函数。本文将为读者介绍shellexecuteinfo结构和ShellExecuteEx函数的使用方法。

了解Windows API 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应用程序。希望此文章对您有所帮助。

  • 原标题:了解Windows API shellexecuteinfo结构:使用ShellExecuteEx函数打开外部应用程序

  • 本文链接:https://qipaikaifa.cn/zxzx/119831.html

  • 本文由深圳中天华智网小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与中天华智网联系删除。
  • 微信二维码

    ZTHZ2028

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:157-1842-0347


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部