65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Windows Vista 中使用预览处理程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (9投票s)

2007 年 7 月 25 日

CPOL

4分钟阅读

viewsIcon

83680

downloadIcon

2190

本文演示了如何在您的应用程序中使用 Windows Vista 预览处理程序。

简介 - Vista 中的预览机制

在 Windows Vista 中,“资源管理器”支持预览文件的新功能。 您可以在“资源管理器”中启用或禁用此功能。

Screenshot - Figure1.jpg

Outlook 2007 和 Vista 都使用相同的预览基础设施来显示预览。它们检查正在使用的文件的扩展名,然后查找机器上为此扩展名安装的任何预览处理程序。 如果为此扩展名注册了预览处理程序,则会加载该预览处理程序并调用它以显示预览。

调用应用程序传递 HWND 和坐标,以及要预览的文件的信息。 预览器在给定区域中放置一个窗口并呈现文件预览。

预览中使用的接口

预览机制基于 IPreviewHandler 接口。 此接口具有显示预览的方法。 预览处理程序需要一种接收文件信息的方法。 为此,预览处理程序需要 IInitializeWithFileIInitializeWithStream 接口。 预览处理程序将需要一个实现上述两个或三个接口的类。

总之,以下接口需要牢记

  • IInitializeWithStream
  • IInitializeWithFile
  • IPreviewHandler

编写预览处理程序

如果您要实现预览处理程序,Windows SDK 示例 PreviewHandler 是一个很好的起点。 我们可以采用它并根据我们的要求对其进行自定义。 我们可以轻松使用文档和示例,因此在此不再讨论。

在应用程序中使用预览处理程序

现在在您的应用程序中使用预览处理程序很容易。 只需加载正确的接口并调用它即可。 但这需要一个类 ID; 组件的 CLSID。

浏览注册表并查找可预览的文件,您会注意到处理程序在 HKEY_CLASSES_ROOT\<extn>\shellex\ {8895b1c6-b41f-4c1c-a562-0d564250836f} 下注册自己。 从那里获取 CLSID 并创建 IID_IPreviewHandler 类型的对象。

Screenshot - Figure2.jpg

现在,IID_IPreviewHandler 本身没有任何参数来获取文件名。 查询此接口是否存在 IInitializeWithFile。 如果你得到接口,你可以用文件路径初始化这个接口。

if( S_OK == CoCreateInstance(cls, NULL, CLSCTX_INPROC_SERVER |
CLSCTX_LOCAL_SERVER, 
IID_IPreviewHandler,(LPVOID*)&m_pIP) )
{
    if( S_OK == m_pIP->QueryInterface(IID_IInitializeWithFile, 
               (LPVOID*)&m_pIFile ); 
    {
        hr = m_pIFile->Initialize( szFile,STGM_READ); 
    }
}

许多预览处理程序没有实现 IInitializeWithFile,而是实现 IInitializeWithStream。 在这种情况下,必须创建和初始化 IStream 对象。 要创建流对象,请使用 CreateStreamOnHGlobal API。 读取文件的内容并初始化此流。

HANDLE hFile = CreateFile(szFile,FILE_READ_DATA, 
                   FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL );
if( INVALID_HANDLE_VALUE != hFile )
{
    DWORD dwSize = GetFileSize( hFile,NULL );
    m_hGlobal= GlobalAlloc(GPTR, dwSize );
    BYTE * pByte = (BYTE *)GlobalLock(m_hGlobal);

    if( pByte )
    {
        ReadFile(hFile,pByte,dwSize,&dwSize,NULL);    
        GlobalUnlock(m_hGlobal);

        CreateStreamOnHGlobal(m_hGlobal, TRUE, &m_pStream);    
        hr = m_pIStream->Initialize( m_pStream,STGM_READ);
    }

    CloseHandle( hFile );
}

现在,您已准备好获取预览。 设置窗口坐标并调用 DoPreview 方法以获取您的预览。

if( m_pIP )
{
    hr = m_pIP->SetWindow( hWnd , &rectPreview );
    hr = m_pIP->DoPreview( );
}

管理文件名和处理程序之间的关联

我们知道 .bat.cmd.inf 和其他一些格式与 .txt 文件属于同一类别。 我们可以只更改一些注册表项并更改预览处理程序,以便可以预览这些文件。

HKEY_CLASSES_ROOT\<extn> 下,列出了您通常使用的所有扩展名。

我们需要添加 "\shellex\ {8895b1c6-b41f-4c1c-a562-0d564250836f}" 键和可以预览此类型文件的服务器的 CLSID。

要查找安装在机器上的预览程序的 CLSID,请查找 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers。 此注册表项具有 CLSID 和友好名称映射。

Screenshot - Figure6.jpg

现在,从 HKEY_CLASSES_ROOT 键枚举所有扩展名,并显示一个带有预览程序的友好名称的 UI,以便用户可以选择预览程序。 选择后,从友好名称获取 CLSID 并使用它来设置预览程序。

我们到达了哪里?

到目前为止

  • 我们能够枚举可用的预览程序
  • 管理关联
  • 预览文件

如果我们将所有这些组合到一个工具中,该工具可以方便地管理预览程序并实际查看目录中的文件的预览。 这些是屏幕截图

Screenshot - Figure7.jpg

结论

如果您有自定义文件格式,那么它需要编写预览处理程序。 编写预览处理程序将使新的文件格式资源管理器友好且易于搜索。

Windows Vista 的预览处理基础设施为应用程序开辟了一个新功能。 文档管理、电子邮件阅读器和打印应用程序可以使用预览机制并提供强大的功能。

参考文献

Windows SDK 文档。

构建说明

  1. 安装 VSTS 2005。
  2. 安装 Windows Vista SDK。
  3. 使用 VSTS 2005 构建。

注释

要设置处理程序,需要以管理员身份启动应用程序 - 该应用程序不了解 UAC。

历史

  • 2007 年 7 月 25 日 -- 创建。
© . All rights reserved.