博客
关于我
SHELLEXECUTEINFO 和 ShellExecuteEx的使用
阅读量:426 次
发布时间:2019-03-06

本文共 2939 字,大约阅读时间需要 9 分钟。

SHELLEXECUTEINFO 结构与 ShellExecuteEx 功能详解

SHELLEXECUTEINFO 结构

在 MSDN 中,SHELLEXECUTEINFO 是一个用于 ShellExecuteEx 函数的结构体,包含了执行 Shell 操作所需的各项信息。该结构体的原型定义如下:

typedef struct _SHELLEXECUTEINFO {    DWORD cbSize;    ULONG fMask;    HWND hwnd;    LPCTSTR lpVerb;    LPCTSTR lpFile;    LPCTSTR lpParameters;    LPCTSTR lpDirectory;    int nShow;    HINSTANCE hInstApp;    // 可选成员    LPVOID lpIDList;    LPCSTR lpClass;    HKEY hkeyClass;    DWORD dwHotKey;    HANDLE hIcon;    HANDLE hProcess;} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;

参数详解

  • cbSize

    结构体的大小,以字节为单位。

  • fMask

    标志位数组,用于标记其他成员的有效性。

  • hwnd

    可选参数,执行 ShellExecuteEx 的窗口句柄,可设为 NULL。

  • lpVerb

    指定执行的动作,支持的动作包括:editexplorefindopenprintproperties

  • lpFile

    \0 结尾的字符串,指定 lpVerb 操作对象的路径,支持的操作包括文本的打开和打印。

  • lpParameters

    可选参数,用于运行或打开程序的命令行参数。如果是打开文档,则该参数无效。

  • lpDirectory

    可选参数,指定工作目录的名称,默认为当前目录。

  • nShow

    必须参数,指定打开的程序显示方式,取自 SW_ 常数。

  • hInstApp

    【输出】如果设置 SEE_MASK_NOCLOSEPROCESS 并且调用成功,则该参数的值大于 32;如果失败,则设置为 SE_ERR_XXX 错误值。

  • lpIDList

    指向 ITEMIDLIST 结构的地址,存储操作的特殊标识符。仅在 fMask 包含 SEE_MASK_IDLISTSEE_MASK_INVOKEIDLIST 时有效。

  • lpClass

    指明文件类型的名称或 GUID。仅在 fMask 包含 SEE_MASK_CLASSNAME 时有效。

  • hkeyClass

    获取已注册的文件类型的句柄。仅在 fMask 包含 SEE_MASK_HOTKEY 时有效。

  • dwHotKey

    程序的热键关联,低位存储虚拟键码,高位存储修改标志位(HOTKEYF_)。

  • hIcon

    获取对应文件类型的图标句柄。仅在 fMask 包含 SEE_MASK_ICON 时有效。

  • hProcess

    指向新启动程序的句柄。如果 fMask 不设为 SEE_MASK_NOCLOSEPROCESS,则该值为 NULL。即使设置了 SEE_MASK_NOCLOSEPROCESS,如果程序未启动,值仍为 NULL。


  • ShellExecuteEx 函数

    功能说明

    ShellExecuteEx 是 Windows API 中用于执行 Shell 操作的函数。它允许开发者通过指定路径和动作,直接启动应用程序或文档。

    函数原型

    BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);

    参数说明

  • lpExecInfo
    输入输出参数,指向 SHELLEXECUTEINFO 结构体,用于传递和保存执行相关信息。
  • 返回值

    • TRUE:函数执行成功。
    • FALSE:函数执行失败。

    ###备注

    • COM 初始化

      在调用 ShellExecuteEx 之前,建议先初始化 COM。部分 Shell 扩展要求使用单线程单元模型 COM,因此应使用以下代码进行初始化:

      CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

      不过,某些情况下 ShellExecuteEx 不需要这种类型的 Shell 扩展,使用前初始化 COM 是一个好的做法。


    示例

    1. 打开一个应用程序

    SHELLEXECUTEINFO ShellInfo;memset(&ShellInfo, 0, sizeof(ShellInfo));ShellInfo.cbSize = sizeof(ShellInfo);ShellInfo.hwnd = NULL;ShellInfo.lpVerb = _T("open");ShellInfo.lpFile = szFilePath; // 写入执行文件的绝对路径ShellInfo.nShow = SW_SHOWNORMAL;ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;BOOL bResult = ShellExecuteEx(&ShellInfo);

    2. 打开一个文档

    与上述代码相同,只需确保 lpFile 指向文档的路径即可。

    3. 打开一个网页

    SHELLEXECUTEINFO ShellInfo;memset(&ShellInfo, 0, sizeof(ShellInfo));ShellInfo.cbSize = sizeof(ShellInfo);ShellInfo.hwnd = NULL;ShellInfo.lpVerb = _T("open");ShellInfo.lpFile = _T("http://www.sina.com");ShellInfo.nShow = SW_SHOWNORMAL;ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;BOOL bResult = ShellExecuteEx(&ShellInfo);

    4. 启动一个程序并等待其运行

    SHELLEXECUTEINFO ShellInfo;memset(&ShellInfo, 0, sizeof(ShellInfo));ShellInfo.cbSize = sizeof(ShellInfo);ShellInfo.hwnd = NULL;ShellInfo.lpVerb = _T("open");ShellInfo.lpFile = szFilePath;ShellInfo.nShow = SW_SHOWNORMAL;ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;ShellExecuteEx(&ShellInfo);WaitForSingleObject(ShellInfo.hProcess, INFINITE);

    以上内容结合了 MSDN 文档和实际开发经验,供开发者参考使用。

    转载地址:http://elpuz.baihongyu.com/

    你可能感兴趣的文章
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Number Sequence(kmp算法)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>
    Numpy 入门
    查看>>
    NumPy 库详细介绍-ChatGPT4o作答
    查看>>