【问题标题】:How to run ShellExecute on shell object clsid?如何在 shell 对象 clsid 上运行 ShellExecute?
【发布时间】:2023-03-02 21:57:01
【问题描述】:

Windows 上的 Shell 资源管理器定义全局对象,例如 ::{2559a1f4-21d7-11d4-bdaf-00c04f60b9f0,它是指向用户“互联网浏览器”的链接。我从一个拖放到我的应用程序上的快捷方式获得了这些值,但我找不到如何使用它来打开它......

我也想知道这个对象是什么。

  • 有人知道如何向 Windows 询问此对象是什么吗?
  • 有人知道怎么打开吗?

我发现这些对象可以通过从注册表中读取来找到:

initString = HLCR\CLSID\\{CLSID\}\PersistentBag\InitString
openCommand = HKLM\Software\Clients\{initString}\shell\open\command

通常直接从注册表读取不是一个好主意。我希望有一种更简洁的方式来读取这些值。

谢谢。

【问题讨论】:

  • {2559a1f3-21d7-11d4-bdaf-00c04f60b9f0} 是 Run (Win+R) 据我所知
  • @anders :你说得对,我在注册表中四处寻找并复制了错误的值。

标签: windows winapi windows-explorer windows-shell


【解决方案1】:

显然您需要填写一个 SHELLEXECUTEINFO 结构,其中 fMask 字段设置为 SEE_MASK_CLASSKEY,lpVerb 字段设置为“open”,lpClass 设置为您的 GUID。

但是,我从来没有让这该死的东西工作。相反,我在 CreateProcess 调用中使用了正确类型的文件。

    HINSTANCE h = FindExecutable("blank.htm", NULL, buffer);

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    char url[MAX_PATH];
    sprintf(url, "\"%s\" %s", buffer, (LPCTSTR)m_url);
    CreateProcess(NULL, url, NULL, NULL, FALSE, 0 , NULL, NULL, &si, &pi);

这会打开定义为 .htm 类型文件的默认查看器的应用程序。

【讨论】:

  • 我真的需要执行这些链接中的任何一个,而不仅仅是“互联网浏览器”一个。不过,我会尝试您的第一个提示。谢谢。
【解决方案2】:

http://msdn.microsoft.com/en-us/library/ms997573.aspx 的“使用 Shell 实例对象创建 Shell 扩展”中得知

传统的 shell 扩展需要 DLL 来实现对象,而 shell 实例对象从注册表中检索它需要知道的所有内容。

从注册表中读取信息似乎是安全的,因为它是创建它们的文档化解决方案。

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多