(ShellExecute、ShellExecuteExecuteEx、SHELLEXECUTEINFO) 启动应用程序 您所在的位置:网站首页 打开文档显示不是有效的win32应用程序 (ShellExecute、ShellExecuteExecuteEx、SHELLEXECUTEINFO) 启动应用程序

(ShellExecute、ShellExecuteExecuteEx、SHELLEXECUTEINFO) 启动应用程序

2023-10-16 12:10| 来源: 网络整理| 查看: 265

(ShellExecute、ShellExecuteExecuteEx、SHELLEXECUTEINFO) 启动应用程序 项目 06/13/2023

应用程序找到文件对象后,下一步通常是以某种方式对其进行操作。 例如,应用程序可能想要启动另一个允许用户修改数据文件的应用程序。 如果感兴趣的文件是可执行文件,则应用程序可能只需启动它。 本文档讨论如何使用 ShellExecute 或 ShellExecuteEx 执行 这些任务。

使用 ShellExecute 和 ShellExecuteExecuteEx 对象谓词 使用 ShellExecuteEx 从站点提供激活服务 使用 ShellExecute 启动搜索对话框 如何使用 ShellExecuteEx 的简单示例 使用 ShellExecute 和 ShellExecuteExecuteEx

若要使用 ShellExecute 或 ShellExecuteExecuteEx,应用程序必须指定要对其执行操作的文件或文件夹对象,以及指定操作的 谓词 。 对于 ShellExecute,将这些值分配给相应的参数。 对于 ShellExecuteExecuteEx,请填写 SHELLEXECUTEINFO 结构的相应成员。 还有其他几个成员或参数可用于微调这两个函数的行为。

文件和文件夹对象可以是文件系统或虚拟对象的一部分,可以通过指向项标识符列表的路径或指针 (PIDL) 进行标识。

对象谓词

可用于对象的谓词实质上是在对象的快捷菜单上找到的项。 若要查找哪些谓词可用,请在注册表中查找

\ HKEY_CLASSES_ROOTClsid\{object_clsid}\壳\动词

其中 ,object_clsid 是对象的 CLSID) (类标识符, 谓词 是可用谓词的名称。 谓词\命令子项包含指示调用该谓词时发生的情况的数据。

若要了解哪些谓词可用于 预定义的 Shell 对象,请在注册表中查找

\ HKEY_CLASSES_ROOT\ object_name壳\动词

其中 object_name 是预定义 Shell 对象的名称。 同样, 谓词\命令 子项包含指示调用该谓词时发生的情况的数据。

常用谓词包括:

谓词 说明 编辑 启动编辑器并打开文档进行编辑。 find 启动从指定目录开始的搜索。 打开 启动应用程序。 如果此文件不是可执行文件,则会启动其关联的应用程序。 print 打印文档文件。 properties 显示对象的属性。 运行方式 以管理员身份启动应用程序。 用户帐户控制 (UAC) 将提示用户同意运行提升的应用程序,或者输入用于运行应用程序的管理员帐户的凭据。

每个谓词对应于将用于从控制台窗口启动应用程序的命令。 open 谓词是一个很好的示例,因为它通常受支持。 对于.exe文件, 打开 只是启动应用程序。 但是,它更常用于启动对特定文件运行的应用程序。 例如,microsoft 写字板可以打开.txt文件。 因此,.txt文件的 打开 谓词对应于类似于以下命令的内容:

"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 #include #include 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 接口。

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有