"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
使用 ShellExecute 或 ShellExecuteExecuteEx 打开.txt文件时,Wordpad.exe以指定的文件作为其参数启动。 某些命令可以具有其他参数(如标志),可以根据需要添加这些参数以正确启动应用程序。 有关快捷菜单和谓词的进一步讨论,请参阅 扩展快捷菜单。
通常,尝试确定特定文件的可用谓词列表会有些复杂。 在许多情况下,只需将 lpVerb 参数设置为 NULL,这将调用文件类型的默认命令。 此过程通常等效于将 lpVerb 设置为“open”,但某些文件类型可能具有不同的默认命令。 有关详细信息,请参阅 扩展快捷菜单 和 ShellExecuteExecuteEx 参考文档。
使用 ShellExecuteEx 从站点提供激活服务
网站链的服务可以控制项激活的许多行为。 从Windows 8开始,可以提供指向 ShellExecuteExcuteEx 的网站链的指针,以启用这些行为。 向 ShellExecuteExecuteEx 提供站点:
在 SHELLEXECUTEINFO 的 fMask 成员中指定SEE_MASK_FLAG_HINST_IS_SITE标志。
在 SHELLEXECUTEINFO 的 hInstApp 成员中提供 IUnknown。
使用 ShellExecute 启动搜索对话框
当用户右键单击 Windows 资源管理器中的文件夹图标时,菜单项之一是“搜索”。 如果他们选择该项目,Shell 会启动其搜索实用工具。 此实用工具显示一个对话框,可用于在文件中搜索指定的文本字符串。 应用程序可以通过调用 ShellExecute 以编程方式启动目录的搜索实用工具,其中“find”作为 lpVerb 参数,目录路径为 lpFile 参数。 例如,以下代码行启动 c:\MyPrograms 目录的 Search 实用工具。
ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);
如何使用 ShellExecuteEx 的简单示例
以下示例控制台应用程序演示 了 ShellExecuteEx 的使用。 为清楚起见,已省略大多数错误检查代码。
#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>
main()
LPITEMIDLIST pidlWinFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfWinFiles = NULL;
IShellFolder *psfDeskTop = NULL;
LPENUMIDLIST ppenum = NULL;
STRRET strDispName;
TCHAR pszParseName[MAX_PATH];
ULONG celtFetched;
SHELLEXECUTEINFO ShExecInfo;
HRESULT hr;
BOOL fBitmap = FALSE;
hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
hr = psfDeskTop->Release();
hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
CoTaskMemFree(pidlItems);
if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
fBitmap = TRUE;
break;
ppenum->Release();
if(fBitmap)
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = pszParseName;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
CoTaskMemFree(pidlWinFiles);
psfWinFiles->Release();
return 0;
应用程序首先检索 Windows 目录的 PIDL,并枚举其内容,直到找到第一个.bmp文件。 与前面的示例不同, IShellFolder::GetDisplayNameOf 用于检索文件分析名称,而不是其显示名称。 由于这是一个文件系统文件夹,因此分析名称是一个完全限定的路径,这是 ShellExecuteExecuteEx 所需的路径。
找到第一个.bmp文件后,会将适当的值分配给 SHELLEXECUTEINFO 结构的成员。 lpFile 成员设置为文件分析名称,将 lpVerb 成员设置为 NULL,以开始默认操作。 在这种情况下,默认操作为“打开”。 然后,结构将传递到 ShellExecuteExecuteEx,后者启动位图文件的默认处理程序(通常为MSPaint.exe)以打开该文件。 函数返回后,将释放 PIDL,并释放 Windows 文件夹的 IShellFolder 接口。