MFC-ShellExecuteEx打开文件
打开执行程序
SHELLEXECUTEINFO ShellInfo; /* 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