ShellExecute、ShellExecuteEx和SHELLEXECUTEINFO 的使用

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值