Windows上的Shell资源管理器定义全局对象,例如:: {2559a1f4-21d7-11d4-bdaf-00c04f60b9f0,它是指向用户“Internet浏览器”的链接。我从拖放到我的应用程序的快捷方式中获得了这些值,但我找不到如何使用它来打开它......
我想获得有关此对象的信息。
我发现可以通过以下方式从注册表中找到这些对象:
initString = HLCR\CLSID\\{CLSID\}\PersistentBag\InitString
openCommand = HKLM\Software\Clients\{initString}\shell\open\command
通常直接从注册表中读取并不是一个好主意。我很高兴有一种更清晰的方式来阅读这些价值观。
感谢。
答案 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实例对象从注册表中检索它需要知道的所有内容。
从注册表中读取信息似乎是安全的,因为它是创建它们的文档化解决方案。