1、首先是SHELLEXECUTEINFO结构体的说明:

在MSDN中:

Contains information used by ShellExecuteEx.

typedef struct _SHELLEXECUTEINFOA {DWORD     cbSize;ULONG     fMask;HWND      hwnd;LPCSTR    lpVerb;LPCSTR    lpFile;LPCSTR    lpParameters;LPCSTR    lpDirectory;int       nShow;HINSTANCE hInstApp;void      *lpIDList;LPCSTR    lpClass;HKEY      hkeyClass;DWORD     dwHotKey;union {HANDLE hIcon;HANDLE hMonitor;} DUMMYUNIONNAME;HANDLE    hProcess;
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;

SHELLEXECUTEINFO参数详解:

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。

2、

2、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是个不错的举措。

3、ShellExecute

HINSTANCE ShellExecuteA(HWND   hwnd,LPCSTR lpOperation,LPCSTR lpFile,LPCSTR lpParameters,LPCSTR lpDirectory,INT    nShowCmd
);

参数:

hwnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。

lpOperation:用于指定要进行的操作。下面的操作字符串是有效的:

"open " 此函数打开由参数lpFile指定的文件,此文件可以是一个可执行文件或文档文件,也可是一个文件夹。 
"print " 此函数打印由参数lpFile指定的文件,此文件应是一个文档文件,假如此文件是一个可执行文件,则打开此文件。 
"explore " 此函数搜索由参数lpFile指定的文件夹,此文件应是一个文档文件,

此参数可以为空。这种情况下,函数用于打开由参数lpFile指定的文件。

lpFile:一个空结束的字符串地址,此字符串指定要打开或打印的文件或者是要打开或搜索的文件夹。

lpParameters:假如参数lpFile指定一个可执行文件,lpParameters则是一个空结束的字符串地址,此字符串指定要传递给应用程序的参数。假如lpFile指定一个文档文件,lpParameters应为空。

lpDirectory:一个空结束的字符串地址,此字符串指定默认目录。

nShowCmd:假如lpFile指定一个可执行文件,nShowCmd表明应用程序打开时如何显示。假如lpFile指定一个文档文件,nShowCmd应为空。

用于指定程序窗口初始显示方式。

#define SW_HIDE             0    /*隐藏窗体,并激活另一个窗体*/
#define SW_SHOWNORMAL       1     /*与SW_RESTORE相同*/
#define SW_SHOWMINIMIZED    2     /*激活并以最小化的形式显示窗体*/
#define SW_SHOWMAXIMIZED    3      /*激活并以最大化的形式显示窗体*/
#define SW_MAXIMIZE         3      /*最大化指定的窗体*/
#define SW_SHOWNOACTIVATE   4       /*以上次的状态显示指定的窗体,但不激活它*/
#define SW_SHOW             5      /*激活窗体,并将其显示在当前的大小和位置上*/
#define SW_MINIMIZE         6      /*最小化指定的窗体,并激活另一个窗体*/
#define SW_SHOWMINNOACTIVE  7       /*以最小化形式显示指定的窗体,但不激活它*/
#define SW_SHOWNA           8       /*以当前的状态显示指定的窗体,但不激活它*/
#define SW_RESTORE          9       /*以原本的大小和位置,激活并显示指定的窗体*/
#define SW_SHOWDEFAULT      10      /*设置显示的状态由STARTUPINFO结构体指定*/

返回值

若函数调用成功,则返回值大于32,否则为一个小于等于32的错误值。

有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。 
WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW);

ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。

首先必须引用shellapi.pas单元:uses ShellAPI;

特殊用法 

  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。

格式一::http://网站域名。

如:ShellExecute(handle, ‘open’, http:// ; www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);

格式二:http://网站域名/网页文件名。

   如:ShellExecute(handle, ‘open’, http:// ; www.neu.edu.cn/default.htm’,nil,nil, SW_SHOWNORMAL);

  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。

格式一:mailto:

  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。

格式二:mailto:用户账号@邮件服务器地址

  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。

格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文

  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。

4、例子

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

或者使用:

//打开一个新的应用程序 ShellExecute(Handle, 'open', PChar('c:/test/app.exe'), nil, nil, SW_SHOW); //打开记事本,并打开一个文件(系统能识别记事本应用程序的路径,因此我们不必使用绝对路径) ShellExecute(Handle, 'open', PChar('notepad'), PChar('c:/test/readme.txt'), nil, SW_SHOW); //打印一个文档 ShellExecute(Handle, 'print', PChar('c:/test/test.doc'), nil, nil, SW_SHOW); 注意:可能你会看到word暂时的被打开,但它会自动关闭。 //打开一个HTML页面 ShellExecute(Handle, 'open', PChar('http://bbs.e-0631.cn'), nil, nil, SW_SHOW); //你能通过一个已经注册的文件类型来打开应用程序 ShellExecute(Handle, 'open', PChar('c:/test/readme.txt'), nil, nil, SW_SHOW); //用windows Explorer 打开一个目录 ShellExecute(Handle, 'explore', PChar('c:/windows)', nil, nil, SW_SHOW); //运行一个DOS命令并立即返回 ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c copy file1.txt file2.txt'), nil, SW_SHOW); //运行一个DOS命令并保持DOS窗口存在 ShellExecute(Handle, 'open', PChar('command.com'), PChar('/k dir'), nil, SW_SHOW);

2、打开一个网页


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

3、启动一个程序,直到它运行结束


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和SHELLEXECUTEINFO 的使用相关推荐

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

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

  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. [笔记]Windows核心编程《番外篇》几种常见的执行命令行方法

    文章目录 前言 WinExec 作用 实例 CreateProcess 作用 实例 System popen ShellExecute ShellExecute ShellExecuteEx 区别比较 ...

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

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

  9. Windows API Reference for C#, VB.NET

    不错的.net 下用API的参考站点 地址在:http://www.webtropy.com/articles/Win32-API-DllImport-art9.asp 下面摘抄分类,便于大家直接就拿 ...

  10. API函数ShellExecute与ShellExecuteEx用法

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

最新文章

  1. Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)...
  2. Js中caller和callee的区别
  3. Java提高班(五)深入理解BIO、NIO、AIO
  4. php 导出excel 汉字乱码问题
  5. feign整合sential_Sentinel 和 Feign 集成时,方法名称写错
  6. centos7按报错dracut
  7. leetcode每日刷题计划-简单篇day6
  8. Java实现单链表翻转
  9. nio java是什么_JAVA NIO是什么(zz)
  10. win7局域网访问共享文件取消需要密码的方法(完美解决)。
  11. 如何提高自己的工作能力 高效工作方法是绝效
  12. 扫地机器人单扫和双扫_扫地机器人初体验 懒人神器还是逗猫的塑料玩具
  13. win10备份(win10备份的系统怎么还原)
  14. 数据分析模型篇—麦肯锡矩阵(GE矩阵)
  15. 百度涉嫌行政违法;库克承诺调查“沙特用App监控女性出境”事件;苹果高管涉内幕交易遭起诉 | 雷锋早报...
  16. Unity可编程渲染管线系列(七)反射(镜面和环境)
  17. iOS二维码生成、识别、扫描等
  18. OLE操作EXCEL
  19. matlab 错误使用 connector.internal.autostart.run输入参数的数目不足。
  20. k8s进阶篇-云原生存储ceph

热门文章

  1. Cadence导入AD的pcb文件中元件的封装
  2. 集成显卡连接显示器的线跟独立显卡的不同么,分别叫什么
  3. 汽车销售管理系统 c语言版 课程设计,《汽车销售管理系统 C语言版》.doc
  4. 无人驾驶全局路径规划之RRT算法
  5. Login.jsp登录页面代码(css+bootstrap)
  6. java复制pdf_java – 使用iText复制带注释的PDF
  7. AES-encryptor
  8. EViews-蒙特卡洛模型代码
  9. 计算机软件系统测试报告模板,测试报告模板
  10. JS:读取excel并显示