ShellExecute函数
ShellExecute函数原型及参数含义如下:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;ShellExecute函数用法:
如何打开一个网页?
如果将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:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文; 如:ShellExecute(handle, L"open", L" mailto:[email protected]?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};MessageBox(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 well
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
ShellExecuteEx函数
此部分转自点击打开链接
ShellExecute()有一个难于使用的重大障碍:它不能返回或使你知道新建进程的Handle。也就是说,你不能导出程序并在继续执行之前等待它终止。换句话说ShellExecute()受到了它的16位血统的损害,它仅仅发掘了新的和更有威力的函数CreateProcess()的一个特征子集—WinExec()也支持的子集。然而在4.0以后版本中引进了一个新函数:ShellExecuteEx()。它有一个Shell函数典型的原型,支持多标志,以及上述所有功能,通过提供对进程同步和PIDLs的支持扩展了ShellExecute()。
ShellExecuteEx()函数明确地取代了ShellExecute()。它在shellapi.h中声明:BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);
SHELLEXECUTEINFO定义如下:
typedef struct _SHELLEXECUTEINFO
{
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
// 可选的成员
LPVOID lpIDList;
LPCSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
HANDLE hIcon;
HANDLE hProcess;
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;
在使用这个结构之前,我们极力建议你把它充填为0,并设置cbSize到结构的实际长度,操作如下:
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
正如声明中的注释所说,结构的成员分成了两组。实际上,头一组使ShellExecuteEx()的功能等价于ShellExecute()。而选项成员组使函数更有力,这正是‘Ex’后缀的由来。hwnd, lpVerb, lpFile, lpParameters, lpDirectory 和 nShow成员等价于ShellExecute()的参数,这是我们已经看到的。而hInstApp成员则是一个输出缓冲,这将由ShellExecute()的返回值填写。nShow成员总是表示建立窗口的风格,即使lpFile是一个应用程序,它也仅仅说明应用应该怎样显示。无论lpFile是应用程序还是文档文件,nShow必须总是赋值为SW_型常量,你是知道的,如果设置为0将获得隐藏窗口。
下面是调用ShellExecuteEx()的最简单方法:
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = __TEXT("explorer.exe");
sei.nShow = SW_SHOW;
sei.lpVerb = __TEXT("open");
ShellExecuteEx(&sei);
ShellExecute()中对应参数的成员之一是fMask。它可以是一个或多个下面值的组合:
标志 描述
SEE_MASK_CLASSKEY 应该使用 hkeyClass 成员
SEE_MASK_CLASSNAME 应该使用 lpClass 成员
SEE_MASK_CONNECTNETDRV lpFile将被解释成UNC(通用命名习惯)格式的文件名
SEE_MASK_DOENVSUBST 任何在lpDirectory和lpFile成员中的环境变量都将被展开,例如,%WINDIR% 打开Windows文件夹
SEE_MASK_FLAG_DDEWAIT 如果函数启动DDE会话,在返回之前等待它终止。
SEE_MASK_FLAG_NO_UI 在错误情况下不显示消息框
SEE_MASK_HOTKEY 应该使用 dwHotkey 成员
SEE_MASK_ICON 应该使用 hIcon 成员
SEE_MASK_IDLIST 强制函数使用lpIDList内容代替lpFile
SEE_MASK_INVOKEIDLIST 引起函数使用lpIDList中指定的PIDL。如果这个成员为NULL,则建立一个lpFile的PIDL,并使用这个PIDL。这个标志重载了SEE_MASK_IDLIST
SEE_MASK_NOCLOSEPROCESS 用进程Handle设置hProcess成员。lpIDList成员可以包含一个用于代替lpFile的PIDL。hProcess返回导出的HPROCESS类型的新进程handle
附加的特征
可选字段适用于某些超出ShellExecute()的附加功能。第一点,也是最重要的一点,可以使用PIDLs来运行应用和打开文件夹。下面是打开‘打印机’文件夹的代码:
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &pidl);
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_SHOW;
sei.lpIDList = pidl;
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = __TEXT("open");
ShellExecuteEx(&sei);
如果指定了SEE_MASK_DOENVSUBST标志,则可以在lpFile和lpDirectory中使用任何环境变量。例如,要打开Windows目录,可以表示为%WINDIR%。
最后,我们获得了由ShellExecuteEx()导出的应用的同步能力。在设置了SEE_MASK_NOCLOSEPROCESS位到fMask成员后,新进程的handle将由hProcess成员返回,因此这一行代码:WaitForSingleObject(sei.hProcess, INFINITE);将导致调用的应用阻塞,等待另一个应用终止。
显示文件属性对话框
SEE_MASK_INVOKEIDLIST标志是一个重要标志,因为这是ShellExecuteEx()另一个优于ShellExecute()的亮点:它允许函数象执行静态动词那样唤醒动态动词。前面解释过,动态动词是运行时由Shell扩展的关联菜单添加的。其工作方法是:如果ShellExecuteEx()不能在静态动词列表中找到这个动词,它就试图寻找给定文件的关联菜单。这个搜索引出IContextMenu接口指针。然后通过接口暴露的方法唤醒动态动词。
作为这个操作的结论,我们可以很容易地显示文件的属性对话框—与右击文件,然后选择属性显示的对话框相同。这里是一个简单的例子函数:
void ShowFileProperties(LPCTSTR szPathName)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = szPathName;
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = __TEXT("properties");
ShellExecuteEx(&sei);
}