转载来源:https://blog.csdn.net/yangyang031213/article/details/64121915

使用 ShellExecuteEx 打开文件或执行程序
可以使用 ShellExecuteEx 打开文件或执行程序,与 ShellExecute 比较,ShellExecuteEx 提供了更多的控制,但是看起来使用也更复杂。 
原型:

BOOL ShellExecuteEx(
  _Inout_ SHELLEXECUTEINFO *pExecInfo
);
1
2
3
输入输出参数都是 SHELLEXECUTEINFO 结构体。 
SHELLEXECUTEINFO定义:

typedef struct _SHELLEXECUTEINFO {
  DWORD     cbSize;//结构大小,sizeof(SHELLEXECUTEINFO)
  ULONG     fMask;//指定结构成员的有效性
  HWND      hwnd;//父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL
  LPCTSTR   lpVerb;//指定该函数的执行动作
  LPCTSTR   lpFile;//操作对象路径
  LPCTSTR   lpParameters;//执行参数,可以为 ULL
  LPCTSTR   lpDirectory;//工作目录,可以为 NULL
  int       nShow;//显示方式
  HINSTANCE hInstApp;//如果设置了 SEE_MASK_NOCLOSEPROCESS ,并且调用成功则该值大于32,调用失败者被设置错误值
  LPVOID    lpIDList;//ITEMIDLIST结构的地址,存储成员的特别标识符,当fMask不包括SEE_MASK_IDLIST或SEE_MASK_INVOKEIDLIST时该项被忽略
  LPCTSTR   lpClass;//指明文件类别的名字或GUID,当fMask不包括SEE_MASK_CLASSNAME时该项被忽略
  HKEY      hkeyClass;//获得已在系统注册的文件类型的Handle,当fMask不包括SEE_MASK_HOTKEY时该项被忽略
  DWORD     dwHotKey;//程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),当fmask不包括SEE_MASK_HOTKEY时该项被忽略
  union {
    HANDLE hIcon;//取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略
    HANDLE hMonitor;//将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略
  } DUMMYUNIONNAME;
  HANDLE    hProcess;//指向新启动的程序的句柄。若fMask不设为SEE_MASK_NOCLOSEPROCESS则该项值为NULL。
                     //但若程序没有启动,即使fMask设为SEE_MASK_NOCLOSEPROCESS,该值也仍为NULL。
                     //如果没有新创建进程,也会为空
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

fMask 用于指定结构成员的内容和有效性,可为下列值的组合:

SEE_MASK_DEFAULT (0)默认
SEE_MASK_CLASSNAME 使用 lpClass 参数,如果 SEE_MASK_CLASSKEY 也有效,则用后者
SEE_MASK_CLASSKEY 使用 hkeyClass 参数
SEE_MASK_IDLIST 使用 lpIDList 参数
SEE_MASK_INVOKEIDLIST 使用选定项目的快捷菜单 IContextMenu 接口处理程序
SEE_MASK_ICON 使用 hIcon 给出的菜单,不能与 SEE_MASK_HMONITOR 共用,Vista之后
SEE_MASK_HOTKEY 使用 dwHotKey 参数
SEE_MASK_NOCLOSEPROCESS 如果执行之后需要返回进程句柄,或者等待执行完毕的话,则需要指定该参数,从结构参数意义可以看到 hProcess 和 hInstApp 都依赖该选项
SEE_MASK_CONNECTNETDRV 验证共享并连接到驱动器号
SEE_MASK_NOASYNC 不等待操作完成,直接返回,会创建一个后台线程运行。
SEE_MASK_FLAG_DDEWAIT 弃用,使用 SEE_MASK_NOASYNC
SEE_MASK_DOENVSUBST 环境变量会被展开
SEE_MASK_FLAG_NO_UI 出现错误,不显示错误消息框,比如不会弹出找不到文件之类的窗口,直接返回失败
SEE_MASK_UNICODE UNICODE 程序
SEE_MASK_NO_CONSOLE 继承父进程的控制台,而不是创建新的控制台,与 CREATE_NEW_CONSOLE 相反
SEE_MASK_ASYNCOK 执行在后台线程,调用立即返回
SEE_MASK_NOQUERYCLASSSTORE 弃用
SEE_MASK_HMONITOR 使用 hmonitor,不能与 SEE_MASK_ICON 共存
SEE_MASK_NOZONECHECKS 不执行区域检查
SEE_MASK_WAITFORINPUTIDLE 创建新进程后,等待进程变为空闲状态再返回,超时时间为1分钟
SEE_MASK_FLAG_LOG_USAGE 跟踪应用程序启动次数
SEE_MASK_FLAG_HINST_IS_SITE
lpVerb 参数与 ShellExecute 的 lpOperation 参数一致:

edit 用编辑器打开 lpFile 指定的文档,如果 lpFile 不是文档,则会失败
explore 浏览 lpFile 指定的文件夹
find 搜索 lpDirectory 指定的目录
open 打开 lpFile 文件,lpFile 可以是文件或文件夹
print 打印 lpFile,如果 lpFile 不是文档,则函数失败
properties 显示属性
runas 请求以管理员权限运行,比如以管理员权限运行某个exe
NULL 执行默认”open”动作
nShow 与 ShellExecute 的该参数一致:

SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同
如果设置了 SEE_MASK_NOCLOSEPROCESS ,调用成功则 hInstApp 返回大于32的值,调用失败会返回:

SE_ERR_FNF (2) 文件未找到
SE_ERR_PNF (3) 路径未找到
SE_ERR_ACCESSDENIED (5) 拒绝访问
SE_ERR_OOM (8) 内存不足
SE_ERR_DLLNOTFOUND (32) 动态库未找到
SE_ERR_SHARE (26) 无法共享打开的文件
SE_ERR_ASSOCINCOMPLETE (27) 文件关联信息不完整
SE_ERR_DDETIMEOUT (28) 操作超时
SE_ERR_DDEFAIL (29) 操作失败
SE_ERR_DDEBUSY (30) DDE 操作忙
SE_ERR_NOASSOC (31) 文件关联不可用
返回值: 
函数执行成功,返回 TRUE ,否则返回 FALSE ,可使用 GetLastError 获取错误码。

ERROR_FILE_NOT_FOUND 文件不存在
ERROR_PATH_NOT_FOUND 路径不存在
ERROR_DDE_FAIL DDE(动态数据交换)失败
ERROR_NO_ASSOCIATION 未找到与指定文件拓展名关联的应用
ERROR_ACCESS_DENIED 拒绝访问
ERROR_DLL_NOT_FOUND 未找到dll
ERROR_CANCELLED 功能提示用户提供额外信息,但是用户取消请求。
ERROR_NOT_ENOUGH_MEMORY 内存不足
ERROR_SHARING_VIOLATION 发生共享冲突
使用:

SHELLEXECUTEINFO sei;
    ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空
    sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似
    sei.lpFile = _T("cmd.exe");
    sei.nShow = SW_SHOW;
    sei.lpVerb = _T("runas");
    ShellExecuteEx(&sei);

ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
    sei.cbSize = sizeof(SHELLEXECUTEINFO);//打开 c:\\ 的属性
    sei.lpFile = _T("c:\\");
    sei.nShow = SW_SHOW;
    sei.fMask = SEE_MASK_INVOKEIDLIST;
    sei.lpVerb = _T("properties");
    ShellExecuteEx(&sei);

ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.lpFile = _T("c");//打开 c 的属性,正常情况下会提示文件路径不存在,
    sei.nShow = SW_SHOW;
    sei.fMask = SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI;//使用 SEE_MASK_FLAG_NO_UI 使出错的情况下不提示错误
    sei.lpVerb = _T("properties");
    ShellExecuteEx(&sei);

ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.lpFile = _T("cmd.exe");
    sei.nShow = SW_SHOW;
    sei.fMask = SEE_MASK_NOCLOSEPROCESS;//使用 SEE_MASK_NOCLOSEPROCESS 参数
    sei.lpVerb = _T("open");
    if (ShellExecuteEx(&sei))//执行成功
    {
        if (sei.hProcess)//指定 SEE_MASK_NOCLOSEPROCESS 并其成功执行,则 hProcess 将会返回执行成功的进程句柄
            WaitForSingleObject(sei.hProcess, INFINITE);//等待执行完毕
    }
    else
    {
        CString s;
        s.Format(_T("ShellExecuteEx error,error code:%d"), GetLastError());
        MessageBox(s);
    }
--------------------- 
作者:yangyang031213 
来源:CSDN 
原文:https://blog.csdn.net/yangyang031213/article/details/64121915 
版权声明:本文为博主原创文章,转载请附上博文链接!

使用ShellExecuteEx打开文件或者其他相关推荐

  1. 使用 ShellExecuteEx 打开文件或执行程序

    使用 ShellExecuteEx 打开文件或执行程序 可以使用 ShellExecuteEx 打开文件或执行程序,与 ShellExecute 比较,ShellExecuteEx 提供了更多的控制, ...

  2. ShellExecuteEX打开iqy文件导致excel hang的原因分析

    1. 问题 当在console中调用API ShellExecuteEx打开"test.iqy"文件时,发现excel会hang住,console退出后excel才会响应,但直接双 ...

  3. c++使用 ShellExecute 打开文件或执行程序

    使用 ShellExecute 打开文件或执行程序 可以使用 ShellExecute 打开文件或执行程序. 原型: HINSTANCE ShellExecute(_In_opt_ HWND hwnd ...

  4. Ubuntu 打开文件 (使用nautilus )

    有时候编译完代码之后想直击打开apk 或者其他的 所在的文件夹 我们在终端中输入nautilus  xx (xx 文件夹的路径) 然后执行回车这样就直接打开文件夹了. 一般在终端中输入nau 在按下t ...

  5. Linux最大打开文件描述符数

    1.    系统最大打开文件描述符数:/proc/sys/fs/file-max a.    查看 $ cat /proc/sys/fs/file-max 186405 2. 设置 a.    临时性 ...

  6. 操作系统学习:Linux0.12初始化详细流程-打开文件与加载可执行程序

    本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 4.Linux内核设计的艺术 ps:基于x86硬件的pc系统 Linux0.1 ...

  7. JS实现HTML上用button打开文件对话框

    JS实现HTML上用button打开文件对话框 在HTML上有一button,点这个button的话,可以弹出文件选择的对话框,用ActiveX实现的,源码如下: Code  1<HTML> ...

  8. java中打开文件显示_从java程序中打开任何文件

    在 java中打开文件似乎有点棘手 – 对于.txt文件,必须将File对象与Scanner或BufferedReader对象结合使用 – 对于图像IO,必须使用 ImageIcon类 – 如果要打开 ...

  9. linux c 判断文件打开文件,Linux 用C语言判断文件和文件夹

    Linux 用C语言判断文件和文件夹 #include #include #include #include int access(const char *pathname, int mode); i ...

最新文章

  1. python使用正则表达式抽取字符串中最大数值数字
  2. Linux gdb调试器
  3. 何恺明最新工作:简单实用的自监督学习方案MAE,ImageNet-1K 87.8%
  4. iOS开发之pch文件的正确使用
  5. springboot整合视图层Thymeleaf、freemarker
  6. 单片机与普通微型计算机不同在于,单片机与普通微型计算机的不同之处
  7. 其实,最好的年龄才刚刚开始
  8. 【spring boot】注解@ApiParam @PathVariable @RequestParam三者区别
  9. ZooKeeper与Eureka作为注册中心的比较
  10. 创建者模式 --- 单例模式
  11. MYSQL数据库优化的八种方式
  12. Java 通过银行卡号获取银行名称
  13. VCPKG 特性 - Overlay triplets
  14. 前端开发一枚,入职前自学的感觉不难,为什么工作起来很吃力?
  15. 程序退出,段错误segment default问题定位
  16. html 纵向滚动条,css设置纵向滚动条
  17. Eclipse TPTP 分析程序性能
  18. 回到计算机桌面快捷键,win10系统如何使用返回桌面快捷键?快速返回到电脑桌面的方法...
  19. 【杂谈】360极速浏览器本地收藏夹的文件在哪里?
  20. 算法:割绳子问题(字节跳动2019笔试)

热门文章

  1. 正确关闭线程池:shutdown 和 shutdownNow 的区别
  2. Java中的回调机制,这篇给你整的明明白白的
  3. Python菜鸟快乐游戏编程_pygame(4)
  4. Python基础—10-常用模块:time,calendar,datetime
  5. 原生js实现文字无缝向上滚动效果
  6. Android和IOS网页不一致汇总
  7. ECS Windows系统使用自带监视器查看IIS并发连接数
  8. hdoj 1114 Piggy-Bank(完全背包+dp)
  9. android webview远程调试
  10. 转载: .net程序员偏向XML开发的面试题