如何在shell对象clsid上运行ShellExecute?

时间:2009-09-21 10:27:49

标签: windows winapi windows-explorer windows-shell

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

我想获得有关此对象的信息。

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

我发现可以通过以下方式从注册表中找到这些对象:

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

通常直接从注册表中读取并不是一个好主意。我很高兴有一种更清晰的方式来阅读这些价值观。

感谢。

2 个答案:

答案 0 :(得分: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类型文件的默认查看器的应用程序。

答案 1 :(得分:0)

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

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

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