Как запустить ShellExecute на объекте оболочки clsid?

Проводник оболочки в Windows определяет глобальные объекты, такие как ::{2559a1f4-21d7-11d4-bdaf-00c04f60b9f0, который является ссылкой на пользовательский «интернет-браузер». Я получил это значение из ярлыка, который перетаскивается по моему приложению, но я не могу найти, как его использовать, чтобы открыть его...

Я также хотел бы получить информацию о том, что это за объект.

  • Кто-нибудь знает, как спросить Windows о том, что это за объект?
  • Кто-нибудь знает, как его открыть?

Я обнаружил, что эти объекты можно найти, прочитав реестр по адресу:

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

Обычно не рекомендуется читать непосредственно из реестра. Я был бы рад более чистому способу чтения этих значений.

Спасибо.


person Emmanuel Caradec    schedule 21.09.2009    source источник
comment
{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}, насколько я могу судить, работает (Win+R).   -  person Anders    schedule 21.09.2009
comment
@anders: ты прав, я порылся в реестре и скопировал неправильное значение.   -  person Emmanuel Caradec    schedule 22.09.2009


Ответы (2)


По-видимому, вам нужно заполнить структуру 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.

person gbjbaanb    schedule 21.09.2009
comment
Мне действительно нужно выполнить любую из этих ссылок, а не только интернет-браузер. Я попробую ваш первый совет, хотя. Спасибо. - person Emmanuel Caradec; 21.09.2009

Из «Создание расширений оболочки с объектами экземпляра оболочки» на http://msdn.microsoft.com/en-us/library/ms997573.aspx сказано, что

В то время как традиционному расширению оболочки для реализации объекта требуется библиотека DLL, объект-экземпляр оболочки извлекает всю необходимую информацию из реестра.

Кажется безопасным читать информацию из реестра, поскольку это документированное решение для их создания.

person Emmanuel Caradec    schedule 22.09.2009