发布时间:2025-12-10 19:37:31 浏览次数:8
ShellExecute、ShellExecuteEx和SHELLEXECUTEINFO 的使用1、首先是SHELLEXECUTEINFO结构体的说明:在MSDN中:ContainsinformationusedbyShellExecuteEx.typedefstruct_SHELLEXECUTEINFOA{DWORDcbSize;ULONGfMask;HWNDhwnd;LPCSTRlpVerb;…
在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_IDLIST或SEE_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、
功能: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是个不错的举措。
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。
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);