SHELLEXECUTEINFO 和 ShellExecuteEx的使用

在日常工作中用到的一些知识,很久没有总结过,前几日参加一个会议,很是无聊。自己思索着自己这两年来所做过的东西,写着写着居然也写下了100个知识点。想把它一条一条总结下来,动笔总不是很容易。就拿这篇文章作为第一篇。

很多东西取之于网络,也有一些自己的心得。才疏学浅,就当一个知识梳理的过程吧。
        
 第一篇 SHELLEXECUTEINFO 和 ShellExecuteEx的使用

使用SHELLEXECUTEINFO和ShellExecuteEx,我也主要是在cab包的安装时使用的。基本上是这样使用的,如下:

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);

一、SHELLEXECUTEINFO 结构

在MSDN中,它这样定义:

Contains information used by ShellExecuteEx

原型如下:

typedef struct _SHELLEXECUTEINFO {       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;       union {          HANDLE hIcon;          HANDLE hMonitor;       } DUMMYUNIONNAME;      HANDLE hProcess;} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

参数详解:

cbSize

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

fMask

一个标志数组,用来设置其他成员的有效性。

hwnd

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

lpVerb

指定执行的动作,包括:edit ,explore ,find ,open,print, properties

lpFile

以/0 结尾的字符串,指出 lpVerb 的操作对象的路径,被系统支持的操作包括文本的 open 、 print等

lpParameters

可选。运行/打开程序的参数,如果打开的是一个文档,则该项无效

lpDirectory

可选。指明工作目录的名字,成员没有说明,则默认为当前目录

nShow

必须。指定打开的程序的显示方式,为SW_值中的一个。

hInstApp

【out】如果设置SEE_MASK_NOCLOSEPROCESS S值并且ShellExecuteEx 调用成功,则该项的值大于32,如果调用失败,则将设置为 SE_ERR_XXX 的错误值。

lpIDList

一个ITEMIDLIST结构的地址,用来存储成员的特别标识符,当fMask不包括SEE_MASK_IDLISTSEE_MASK_INVOKEIDLIST时该项被忽略

lpClass

用以指明文件类别的名字或GUID,当fMask不包括SEE_MASK_CLASSNAME时该项被忽略

hkeyClass

获得已在系统注册的文件类型的Handle,当fMask不包括SEE_MASK_HOTKEY时该项被忽略

dwHotKey

程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),修改标志为(modifier flags)的详细列表请看WM_SETHOTKEY消息的描述,当fmask不包括SEE_MASK_HOTKEY时该项被忽略

DUMMYUNIONNAME

hIcon

取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略

hMonitor

将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略

hProcess

指向新启动的程序的句柄。若fMask不设为SEE_MASK_NOCLOSEPROCESS则该项值为NULL。但若程序没有启动,即使fMask设为SEE_MASK_NOCLOSEPROCESS,该值也仍为NULL。

二、ShellExecuteEx

功能:Performs an operation on a specified file。对指定应用程序执行某个操作

原型:
BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);

参数

lpExecInfo

[in, out] 一个指向 SHELLEXECUTEINFO 结构的指针,用来传递和保存应用程序执行相关的信息。

返回值

如果函数成功执行就返回TRUE,否则返回 FALSE 。可调用 GetLastError 获取错误信息。

备注

由于ShellExecuteEx 能够将执行委托给那些由组件对象模型COM激活的Shell 扩展(数据源,上下文菜单句柄,动词实现),因此在调用ShellExecuteEx 之前要先初始化 COM。某些Shell 扩展要求单线程单元模型的COM,在这种情况下,应当像下面一般初始化COM:

CoInitializeEx (NULL,COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

在某些情况下 ShellExecuteEx 并没有使用这种类型的Shell 扩展,这时就无需初始化COM。虽然如此,总是在使用这个函数之前初始化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、如何打开一个文档

程序代码如上

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);

下面是ShellExecute和ShellExecuteEx的用法

Q: 如何打开一个应用程序? 
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );或 ShellExecute(this->m_hWnd,"open","notepad.exe","c://MyLog.log","",SW_SHOW );正如您所看到的,我并没有传递程序的完整路径。

Q: 如何打开一个同系统程序相关连的文档?ShellExecute(this->m_hWnd,"open","c://abc.txt","","",SW_SHOW );

Q: 如何打开一个网页? 
ShellExecute(this->m_hWnd,"open","http://www.google.com","","", SW_SHOW );

Q: 如何激活相关程序,发送EMAIL? 
ShellExecute(this->m_hWnd,"open","mailto:nishinapp@yahoo.com","","", SW_SHOW );

Q: 如何用系统打印机打印文档? 
ShellExecute(this->m_hWnd,"print","c://abc.txt","","", SW_HIDE);

Q: 如何用系统查找功能来查找指定文件? 
ShellExecute(m_hWnd,"find","d://nish",NULL,NULL,SW_SHOW);

Q: 如何启动一个程序,直到它运行结束? 
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c://MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或: 
PROCESS_INFORMATION ProcessInfo; 
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c://winnt//notepad.exe", NULL, 
    NULL,NULL,FALSE,0,NULL,
    NULL,&StartupInfo,&ProcessInfo))

    WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
}  
else
{
    MessageBox("The process could not be started...");
}

Q: 如何显示文件或文件夹的属性? 
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c://"; //can be a file as well
ShExecInfo.lpParameters = ""; 
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo);

ShellExecuteEx and SHELLEXECUTEINFO and ShellExecute相关推荐

  1. qt中ShellExecute、ShellExecuteEx和WinExec的用法和区别

    今天我要介绍的是支持管理员权限的启动进程的几种方式. 分别是ShellExecute,ShellExecuteEx,WinExec. 它们的各自特点: ShellExecute:是通过windows外 ...

  2. 使用ShellExecuteEx打开文件或者其他

    转载来源:https://blog.csdn.net/yangyang031213/article/details/64121915 使用 ShellExecuteEx 打开文件或执行程序 可以使用 ...

  3. ShellExecuteEx使用方法与常用实例

    一.ShellExecuteEx 使用 ShellExecuteEx 打开文件或执行程序 可以使用 ShellExecuteEx 打开文件或执行程序,与 ShellExecute 比较,ShellEx ...

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

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

  5. ShellExecuteEx提升子进程权限

    首先说下ShellExecuteEx是如何提升权限的,ShellExecuteEx函数只有一个参数,就是SHELLEXECUTEINFO结构体,不过是指针类型的,这无所谓,关键是这个结构体中有一个参数 ...

  6. [转]Windows Shell 编程 第八章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987961】...

    第八章 程序执行器 在Windows95以后,文档的概念得到了进一步增强.这隐含地说,文档不仅仅是ASCII文档,也不仅仅是Word或Excel文件,'文档'在这里的意思是更广泛的对象,它是系统命名空 ...

  7. 如何隐藏system函数的窗口

    如何隐藏system函数的窗口 修改浏览权限 | 删除 由于一直在写控制台的程序,对于MFC并不是很熟.这次写osg<-->ive格式转换器这个小工具的时候,涉及到使用setlocale函 ...

  8. 加载应用程序(ShellExecute,ShellExecuteEx,SHELLEXECUTEINFO)

    https://docs.microsoft.com/en-us/windows/desktop/shell/launch 一旦你的应用程序定位了一个文件,下一个对其进行的步骤就是对其进行某些操作.例 ...

  9. API函数ShellExecute与ShellExecuteEx用法

    ShellExecute: 1.函数功能: 你可以给它任何文件的名字,它都能识别出来并打开它. 2.函数原型: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR l ...

  10. 使用winExec 、ShellExecute、ShellExecuteEx、CreateProcess创建进程

    进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,每一个进程都是一个实体有属于自己的地址空间,进程也是一个执行的程序(也就是说一个运行中的 ...

最新文章

  1. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
  2. EE Servlet 3:使用会话和过滤器开发用户登录
  3. ITK读图VTK显示
  4. StringEscapeUtils类的使用
  5. idea下如何正确导入多个module
  6. VirtualBox Failed to open/create the internal network 错误处理
  7. python 将字符串转换为字典
  8. php合并两个有序链表,合并两个排序的链表
  9. DJ设备市场现状及未来发展趋势
  10. 哲学家就餐问题python_哲学家就餐问题的一种Python解决方案
  11. 黄金分割法求解局部最小值——python实现
  12. python 手机号码_Python手机号码归属地查询代码
  13. 王者荣耀赛季更新服务器维护到什么时候,王者荣耀s9维护到几点 王者荣耀s10赛季上线时间一览...
  14. ros中rviz不显示摄像头视频问题的解决
  15. 数据库设计基本概念及知识
  16. 我们开发了一款待办事项分享平台——待办库(Todo Store)
  17. 串口服务器 linux,基于Linux的串口服务器设计与实现
  18. Windows桌面应用程序(1-2-4-4th) 您的第一个Direct2D程序
  19. 博图买什么样配置的笔记本_西门子PLC编程软件-博图软件用什么配置的电脑最好?...
  20. 【模拟+线段树】 hdu4262 Juggler

热门文章

  1. PDF如何排版骑马钉打印
  2. 一个在线工具箱:栅栏密码加密解密工具
  3. 基于xxx的系统实现
  4. 运筹学基础及其matlab,运筹学基础及其MATLAB应用
  5. 运筹学 知识点总结(三)
  6. java 车牌号判断
  7. JVM基础知识1---尚硅谷视频笔记整理
  8. 数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)~
  9. 怎么用matlab幅频特性曲线怎么模拟,幅频特性曲线的MATLAB模拟
  10. 《推荐系统实战(一)》基于统计的电影推荐系统(tmdb-5000数据集,数据清洗、特征提取、搭建模型等详细过程)