首页 > 解决方案 > 如何通过代理主机运行文件预览处理程序

问题描述

根据文档

预览处理程序总是用完进程。有两种实现方法:

  1. 预览处理程序可以构建为进程内服务器,但通过进程外代理主机运行。这是首选方法。系统在 Prevhost.exe 文件中为此提供了一个代理主机。通过此方法构建的预览处理程序与 Windows XP 上的 Outlook 2007 不兼容。但是,这些相同的处理程序将在 Windows 资源管理器和 Windows Vista 上运行的 Outlook 2007 中工作。

  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,还是你完全需要其他方法?尝试在 proc 中为 Office 文件实例化处理程序总是失败。

标签: c++winapicomipreviewhandler

解决方案


推荐阅读