1

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

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

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

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

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

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

谢谢。

4

2 回答 2

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 类型文件的默认查看器的应用程序。

于 2009-09-21T10:43:02.537 回答
0

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

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

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

于 2009-09-22T16:30:54.203 回答