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

 

 

posted @ 2023-05-11 17:06  天子骄龙  阅读(222)  评论(0编辑  收藏  举报