根据文档:
预览处理程序总是用完进程。有两种实现方法:
预览处理程序可以构建为进程内服务器,但通过进程外代理主机运行。这是首选方法。系统在 Prevhost.exe 文件中为此提供了一个代理主机。通过此方法构建的预览处理程序与 Windows XP 上的 Outlook 2007 不兼容。但是,这些相同的处理程序将在 Windows 资源管理器和 Windows Vista 上运行的 Outlook 2007 中工作。
预览处理程序可以构建为本地组件对象模型 (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 文件实例化处理程序总是失败。