使用 ShellExecute 打开文件或执行程序

可以使用 ShellExecute 打开文件或执行程序。

原型:

HINSTANCE ShellExecute(_In_opt_ HWND    hwnd,//父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL_In_opt_ LPCTSTR lpOperation,//操作_In_     LPCTSTR lpFile,//要打开的文件名、执行的程序名、浏览的文件夹等。_In_opt_ LPCTSTR lpParameters,//可执行程序的参数,否则为 NULL_In_opt_ LPCTSTR lpDirectory,//默认目录_In_     INT     nShowCmd//显示类型
);

lpOperation 是一个字符串,通常为:

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

nShowCmd 执行操作之后程序显示类型,指定该参数后运行起来的程序不一定能按照指定参数显示,只是通知程序的显示状态。类型如下:

  • SW_HIDE 隐藏窗口,活动状态给令一个窗口
  • SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
  • SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
  • SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
  • SW_SHOWMAXIMIZED 最大化窗口,并将其激活
  • SW_SHOWMINIMIZED 最小化窗口,并将其激活
  • SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
  • SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
  • SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
  • SW_SHOWNORMAL 与SW_RESTORE相同

返回值:
返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。错误如下:

  • 0 系统内存或资源不足
  • ERROR_FILE_NOT_FOUND 找不到指定的文件
  • ERROR_PATH_NOT_FOUND 找不到指定路径
  • ERROR_BAD_FORMAT .exe文件无效
  • SE_ERR_ACCESSDENIED 拒绝访问指定文件
  • SE_ERR_ASSOCINCOMPLETE 文件名关联无效或不完整
  • SE_ERR_DDEBUSY DDE事务正在处理,DDE事务无法完成
  • SE_ERR_DDEFAIL DDE事务失败
  • SE_ERR_DDETIMEOUT 请求超时,无法完成DDE事务请求
  • SE_ERR_DLLNOTFOUND 未找到指定dll
  • SE_ERR_FNF 未找到指定文件
  • SE_ERR_NOASSOC 未找到与给的文件拓展名关联的应用程序,比如打印不可打印的文件等
  • SE_ERR_OOM 内存不足,无法完成操作
  • SE_ERR_PNF 未找到指定路径
  • SE_ERR_SHARE 发生共享冲突

怎样打开一个网页?

假设将FileName參数设置为http:协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。

若用户机器中安装了多个浏览器,则该函数将依据Windows 9x/NT注冊表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。

如:ShellExecute(handle,L"open",L" http://www.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL);ShellExecute()函数在HKEY_CLASSES_ROOT\http\shell\open\command下进行搜索。默认浏览器在注冊表HKEY_CLASSES_ROOT\.htm键下的Default设置。

怎样激活相关程序,发送EMAIL?

假设将FileName參数设置为mailto:协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包含Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将依据Windows 9x/NT注冊表中mailto协议处理程序的设置确定启动哪个邮件客户程序。mailto:用户账号@邮件server地址?subject=邮件主题&body=邮件正文;

如:ShellExecute(handle,L"open",L"mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test", NULL,NULL, SW_SHOWNORMAL);

打开新邮件窗体,并自己主动填入收件人地址、邮件主题和邮件正文。若邮件正文包含多行文本,则必须在每行文本之间增加换行转义字符%0a。ShellExecute()函数在HKEY_CLASSES_ROOT\mailto\shell\open\command下搜索。

怎样打开一个程序?

ShellExecute(NULL,L"open",L"notepad.exe",  L"c:\\MyLog.log", NULL, SW_SHOW );

怎样用系统打印机打印文档?

ShellExecute(NULL,L"print", L"c:\\abc.txt",NULL, NULL, SW_HIDE);

怎样用系统查找功能来查找指定文件?

ShellExecute(NULL,L"find",L"d:\\nish",  NULL, NULL, SW_SHOW);

怎样启动一个程序,直到它执行结束?

        SHELLEXECUTEINFO ShExecInfo = {0};ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd = NULL;ShExecInfo.lpVerb = NULL;ShExecInfo.lpFile =L"c:\\MyProgram.exe";ShExecInfo.lpParameters = NULL;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] parameterZeroMemory(&StartupInfo, sizeof(StartupInfo));StartupInfo.cb = sizeof StartupInfo ; //Only compulsory fieldif(CreateProcess(L"c:\\winnt\\notepad.exe", NULL, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo)){WaitForSingleObject(ProcessInfo.hProcess,INFINITE);CloseHandle(ProcessInfo.hThread);CloseHandle(ProcessInfo.hProcess);}  elseMessageBox(NULL,L"The process could not be started",NULL,NULL);

怎样显示文件或目录的属性?

        SHELLEXECUTEINFO ShExecInfo ={0};ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;ShExecInfo.hwnd = NULL;ShExecInfo.lpVerb = L"properties";ShExecInfo.lpFile = L"c:\\"; //can be a file as wellShExecInfo.lpParameters = NULL;ShExecInfo.lpDirectory = NULL;ShExecInfo.nShow = SW_SHOW;ShExecInfo.hInstApp = NULL;ShellExecuteEx(&ShExecInfo);

使用方法

    int ret = (int)ShellExecute(NULL, _T("open"), _T("Dbgview.exe"), NULL, NULL, SW_NORMAL);//打开exeif (ret < 32)//检测是否指定成功MessageBox(_T("ERROR"));ret = (int)ShellExecute(NULL, _T("open"), _T("help.pdf"), NULL, NULL, SW_NORMAL);//打开指定文件,将调用默认处理的程序打开if (ret < 32)MessageBox(_T("ERROR"));ret = (int)ShellExecute(NULL, _T("open"), _T("https://www.baidu.com"), NULL, NULL, SW_NORMAL);//打开网址if (ret < 32)MessageBox(_T("ERROR"));ret = (int)ShellExecute(NULL, _T("open"), _T("c:\\windows"), NULL, NULL, SW_NORMAL);//打开文件夹if (ret < 32)MessageBox(_T("ERROR"));ret = (int)ShellExecute(NULL, _T("runas"), _T("cmd.exe"), NULL, NULL, SW_NORMAL);//请求管理员权限打开cmdif (ret < 32)MessageBox(_T("ERROR"));

实例:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>int main(void)
{test01();
}int test01()
{HINSTANCE hNewExe = ShellExecuteA(NULL, "open", "calc.exe", NULL, NULL, SW_SHOW);if ((DWORD)hNewExe <= 32){printf("return value:%d\n", (DWORD)hNewExe);}else{printf("successed!\n");}printf("GetLastError: %d\n", GetLastError());system("pause");return 1;
}

c++使用 ShellExecute 打开文件或执行程序相关推荐

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

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

  2. c语言的shellexecute打开文件,API函数ShellExecute的使用

    API函数ShellExecute的使用 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 ShellExecute 说明 Shellexecute 函数用于对文件执行一个动词(ve ...

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

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

  4. XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...

    问题现象 1. 在使用了UPM与文件夹重定向后,个人的桌面路径就会变成一个UNC路径,这个时候如果用户登录共享桌面的话可以看到桌面与快速启动栏的文件与快捷方式,但是打开的时候就会遇到以下错误 这种情况 ...

  5. fuser查询已打开文件或已执行程序打开的文件

    fuser 使用文件或者套节字来表示识别进程,常用两个功能: 1. 查看需要的进程 2. 杀死查到的进程 [root@localhost ~]# fuser -vm /usr/local/ -bash ...

  6. delphi调用外部程序打开文件

    delphi调用外部程序打开文件 ShellExecute的各种用法 一.利用系统默认的邮件收发器发送电子邮件 Uses -, ShellAPI; Var lpHwnd: HWND; lpOperat ...

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

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

  8. 在Qt中用默认程序打开文件

    用法:    QProcess::execute("explorer 文件名"); 例:        QProcess::execute("explorer c:\\1 ...

  9. qt 无法打开shell32_在Qt中用默认程序打开文件

    用法:    QProcess::execute("explorer 文件名"); 例:        QProcess::execute("explorer c:\\1 ...

最新文章

  1. [云炬创业基础笔记]第十章企业的利润计划测试3
  2. C#-自动(也叫隐式)类型转换及规则 018
  3. [luogu3290][SCOI2016]围棋
  4. P5268-[SNOI2017]一个简单的询问【莫队】
  5. 依赖注入底层反射原理_PHP反射机制实现自动依赖注入
  6. springboot 找不到mapper问题
  7. 洛谷P1288 取数游戏II[博弈论]
  8. Android学习第六天---seekbar
  9. Linux基础教程之系统管理篇系统部署
  10. oracle sqlcode 多条,oracle sqlerrm和sqlcode函数
  11. 印章管控私有化部署,助力政企办公开启新纪元
  12. 5.Django路由path和re_path详解
  13. 国庆在家写了个简易版的在线简历网站
  14. 洛谷P1378 油滴扩展
  15. PHP判断中文字符串的长度和字节长度
  16. Java操作Excel基础--POI之HSSF
  17. 新年寄语 —— 奋斗2022
  18. IPV6 UDP socket报错:网络不可达
  19. AM335x网络分析+KSZ9031分析(uboot中ping不通问题)
  20. 多用户商城系统定制开发源码

热门文章

  1. oracle create or replace directory 的用法
  2. 腾讯云tca认证要具备哪些能力?腾讯云tca认证适合那些人群
  3. 常用网络抓包工具推荐
  4. python牛顿迭代法求平方根_牛顿迭代法计算平方根
  5. 什么是场控?直播间的场控到底需要做些什么?
  6. 欢聚时代java面试面经_欢聚时代(YY)校园招聘一面面经-java开发工程师
  7. 金万维快解析远程服务,助力企业客户维护
  8. 是技术进步,还是心理成熟?
  9. JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)
  10. 记我经历的一次公司破产经历,一行代码害死一家公司