Как запустить обработчик предварительного просмотра файла через суррогатный хост
Согласно документам:
Обработчики предварительного просмотра всегда выходят из строя. Есть два способа реализовать это:
Обработчик предварительного просмотра может быть построен как внутрипроцессный сервер, но работать через суррогатный хост вне процесса. Это предпочтительный метод. Система предоставляет для этого суррогатный хост в файле Prevhost.exe. Обработчики предварительного просмотра, созданные этим методом, несовместимы с Outlook 2007 в Windows XP. Однако эти же обработчики будут работать в проводнике Windows и Outlook 2007 под управлением Windows Vista.
Обработчик предварительного просмотра может быть построен как локальный сервер модели компонентных объектов (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 в процессе всегда терпит неудачу.