Как запустить обработчик предварительного просмотра файла через суррогатный хост

Согласно документам:

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

  1. Обработчик предварительного просмотра может быть построен как внутрипроцессный сервер, но работать через суррогатный хост вне процесса. Это предпочтительный метод. Система предоставляет для этого суррогатный хост в файле Prevhost.exe. Обработчики предварительного просмотра, созданные этим методом, несовместимы с Outlook 2007 в Windows XP. Однако эти же обработчики будут работать в проводнике Windows и Outlook 2007 под управлением Windows Vista.

  2. Обработчик предварительного просмотра может быть построен как локальный сервер модели компонентных объектов (COM). Это не рекомендуется по нескольким причинам. Во-первых, проще реализовать внутрипроцессный сервер. Что еще более важно, реализация в качестве внутрипроцессного сервера обеспечивает больший контроль над жизненным циклом объекта-обработчика, что обеспечивает лучшую очистку и эффективность.

Как хост первым запускает обработчик предварительного просмотра? Я пробовал создать такой обработчик предварительного просмотра, но, в отличие от обработчика предварительного просмотра в проводнике, это не приводит к запуску суррогатного хоста обработчика предварительного просмотра:

HRESULT PreviewHandlerFromExt(LPCWSTR pszExt, IPreviewHandler** ppph)
{
    WCHAR szCLSID[CLSID_LEN] = { 0 };
    DWORD cchOut = CLSID_LEN;
    HRESULT hr = AssocQueryString(  ASSOCF_INIT_DEFAULTTOSTAR,
                                    ASSOCSTR_SHELLEXTENSION,
                                    pszExt,
                                    L"{8895b1c6-b41f-4c1c-a562-0d564250836f}",
                                    szCLSID,
                                    &cchOut );
    if (FAILED(hr))
    {
        return hr;
    }

    CLSID clsid;
    hr = CLSIDFromString(szCLSID, &clsid);
    if (FAILED(hr))
    {
        return hr;
    }

    CComPtr<IUnknown> punk;
    hr = punk.CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER);
    if (FAILED(hr))
    {
        return hr;
    }

    CComPtr<IPreviewHandler> pPrevHandler;
    hr = punk->QueryInterface(&pPrevHandler);
    if (FAILED(hr) || !pPrevHandler)
    {
        return hr;
    }

    return pPrevHandler.CopyTo(ppph);
}

Вам нужен другой флаг для CoCreateInstance, или вам вообще нужен какой-то другой метод? Попытка создать обработчики для файлов Office в процессе всегда терпит неудачу.

0 ответов

Другие вопросы по тегам