typedef struct _SHELLEXECUTEINFO {
DWORD cbSize; 存储该结构的长度,以字节为单位
ULONG fMask; 一个标志数组,用来设置其他成员的有效性
SEE_MASK_CLASSKEY=0x3 使用 hkeyClass 参数
SEE_MASK_CLASSNAME=0x1 使用 lpClass 参数,如果 SEE_MASK_CLASSKEY 也有效,则用后者
SEE_MASK_CONNECTNETDRV=0x80 验证共享并连接到驱动器号
SEE_MASK_DOENVSUBST=0x200 环境变量会被展开
SEE_MASK_FLAG_DDEWAIT=0x100 弃用,使用 SEE_MASK_NOASYNC
SEE_MASK_FLAG_LOG_USAGE=0x4000000 跟踪应用程序启动次数
SEE_MASK_FLAG_NO_UI=0x400 出现错误,不显示错误消息框,比如不会弹出找不到文件之类的窗口,直接返回失败
SEE_MASK_HMONITOR=0x200000 使用 hmonitor,不能与 SEE_MASK_ICON 共存
SEE_MASK_HOTKEY=0x20 使用 dwHotKey 参数
SEE_MASK_ICON=0x10 使用 hIcon 给出的菜单,不能与 SEE_MASK_HMONITOR 共用,Vista之后
SEE_MASK_IDLIST=0x4 使用 lpIDList 参数
SEE_MASK_INVOKEIDLIST=0xC 使用选定项目的快捷菜单 IContextMenu 接口处理程序
SEE_MASK_NOASYNC=0x100000 不等待操作完成,直接返回,会创建一个后台线程运行
SEE_MASK_NOCLOSEPROCESS=0x40 如果执行之后需要返回进程句柄,或者等待执行完毕的话,则需要指定该参数,从结构参数意义可以看到 hProcess 和 hInstApp 都依赖该选项
SEE_MASK_NOZONECHECKS=0x800000 不执行区域检查
SEE_MASK_NO_CONSOLE=0x8000 继承父进程的控制台,而不是创建新的控制台,与 CREATE_NEW_CONSOLE 相反
SEE_MASK_UNICODE=0x100000 UNICODE 程序
SEE_MASK_FILEANDURL=0x4000000
SEE_MASK_DEFAULT=0 默认
SEE_MASK_ASYNCOK 执行在后台线程,调用立即返回
SEE_MASK_WAITFORINPUTIDLE 创建新进程后,等待进程变为空闲状态再返回,超时时间为1分钟
HWND hwnd; 调用这个ShellExecuteEx的窗口句柄
LPCTSTR lpVerb; 设定这个ShellExecuteEx的动作,包括:
edit 打开编辑器编辑文档,如果 lpFile 不是一个文档,则这个函数会失败
explore 以 lpFile 为路径打开资源管理器
find 从指定目录lpDirectory开始搜索
open 根据 lpFile 打开对应文件,该文件可以为可执行文件、文档或者文件夹
print 根据 lpFile 打印文档,若lpFile不是一个文档则该函数会失败
properties 显示文件或文件夹的属性
runas 请求以管理员权限运行,比如以管理员权限运行某个exe
NULL 执行默认”open”动作
LPCTSTR lpFile; 以\0 结尾的字符串,指出 lpVerb 的操作对象的路径
LPCTSTR lpParameters; 运行/打开程序的参数,如果打开的是一个文档,则该项无效
LPCTSTR lpDirectory; 指明工作目录的名字,成员没有说明,则默认为当前目录
int nShow; 说明ShellExecuteEx打开的程序将以什么形式显示
SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同
HINSTANCE hInstApp; 如果函数运行成功,该项的值将大于32,否则会是下列错误对应的值
SE_ERR_FNF 没有找到文件
SE_ERR_PNF 没有找到路径
SE_ERR_ACCESSDENIED 拒绝访问
SE_ERR_OOM 内存不足
SE_ERR_DLLNOTFOUND 没有找到动态链接库
SE_ERR_SHARE 不能操作一个以打开的文件
SE_ERR_ASSOCINCOMPLETE 文件关联信息不完整
SE_ERR_DDETIMEOUT DDE操作超时
SE_ERR_DDEFAIL DDE操作失败
SE_ERR_DDEBUSY DDE繁忙
SE_ERR_NOASSOC 没有找到文件关联
LPVOID lpIDList; 一个itemidlist结构的地址,用来存储成员的特别标识符,当fMask不包括see_mask_idlist或see_mask_invokeidlist时该项被忽略
LPCTSTR lpClass; 用以指明文件类别的名字或GUID,当fMask不包括see_mask_classname时该项被忽略
HKEY hkeyClass; 获得已在系统注册的文件类型的Handle,当fMask不包括see_mask_classkey时该项被忽略
DWORD dwHotKey; 程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),
修改标志为(modifier flags)的详细列表请看wm_sethotkey消息的描述,当fmask不包括see_mask_hotkey时该项被忽略
union {
HANDLE hIcon; 取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略
HANDLE hMonitor; 将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略
} DUMMYUNIONNAME;
HANDLE hProcess; 用于进行return操作的进程
若fMask不设为see_mask_nocloseprocess则该项值为null,
即使fMask设为see_mask_nocloseprocess,若没有进程启动,该项值仍为null。即没有新的进程启动,则该项值一只为null
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
memset(&ShellInfo,
0
,
sizeof
(ShellInfo));
//
设置内存值
参数1:void *s 指向要填充的内存块
参数2:int c 要被设置的值
参数3:size_t n 要被设置该值的字符数
返回值:void * 是一个指向存储区s的指针
ShellInfo.cbSize =
sizeof
(ShellInfo);
//
大小
ShellInfo.lpVerb = _T(
"
open
"
);
//
运行
TCHAR szFilePath[] = _T(
"
C:\\Users\\Administrator\\Desktop\\test1.exe
"
);
ShellInfo.lpFile
= szFilePath;
//
带路径的执行文件名
ShellInfo.nShow = SW_SHOWNORMAL;
//
正常显示
ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
//
保存新程序句柄到hProcess,不显示错误提示框
BOOL b = ShellExecuteEx(&
ShellInfo);
WaitForSingleObject(ShellInfo.hProcess, INFINITE);
//
等待线程激活
打开一个网页
//打开一个网页
SHELLEXECUTEINFO ShellInfo;
memset(&ShellInfo, 0, sizeof(ShellInfo));
ShellInfo.cbSize = sizeof(ShellInfo);
ShellInfo.lpVerb = _T("open");
ShellInfo.lpFile = _T("http://www.baidu.com"); //网址
ShellInfo.nShow = SW_SHOWNORMAL;
ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;//保存新程序句柄到hProcess,不显示错误提示框
BOOL bResult = ShellExecuteEx(&ShellInfo);
打开文件夹或文件属性窗口
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//清零
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = _T("D:\\bb"); //文件夹
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = _T("properties");
ShellExecuteEx(&sei);
打开记事本文件
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//清零
sei.cbSize = sizeof(SHELLEXECUTEINFO);
TCHAR szFilePath[] = _T("C:\\WINDOWS\\NOTEPAD.EXE");
sei.lpFile = szFilePath; // 带路径的执行文件名
sei.nShow = SW_SHOWNORMAL; //正常显示
sei.lpParameters = _T("C:\\123.txt");
sei.lpVerb = _T("open"); //运行
ShellExecuteEx(&sei);
实例工程下载:
链接:https://pan.baidu.com/s/1PRdEYHe9czb1mPSkEYyc3w
提取码:6666