shellexecuteinfo(ShellExecute、ShellExecuteEx和SHELLEXECUTEINFO 的使用)

发布时间:2025-12-10 19:37:31 浏览次数:8

ShellExecute、ShellExecuteEx和SHELLEXECUTEINFO 的使用-

ShellExecute、ShellExecuteEx和SHELLEXECUTEINFO 的使用1、首先是SHELLEXECUTEINFO结构体的说明:在MSDN中:ContainsinformationusedbyShellExecuteEx.typedefstruct_SHELLEXECUTEINFOA{DWORDcbSize;ULONGfMask;HWNDhwnd;LPCSTRlpVerb;…

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

在MSDN中:

Contains information used byShellExecuteEx.

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。对指定应用程序执行某个操作

原型:
BOOLShellExecuteEx(LPSHELLEXECUTEINFOlpExecInfo);

参数

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);
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477