Windows Vista 和 Office: 使用托管预览处理程序框架以自己的方式查看数据
2009-02-09 17:43:48 来源:WEB开发网void IOleWindow.GetWindow(out IntPtr phwnd)
{
phwnd = _previewControl.Handle;
}
void IOleWindow.ContextSensitiveHelp(bool fEnterMode)
{
throw new NotImplementedException();
}
IObjectWithSite IObjectWithSite 也很简单。此接口用于向对象提供指向与其容器关联的站点的指针。提供给 SetSite 的站点实际上是 IPreviewHandlerFrame,它包含预览处理程序的窗口。这样,SetSite 方法将所提供的 IUnknown 接口指针存储在私有成员(GetSite 可以在请求时返回该成员)中,并将它转换成 IPreviewHandlerFrame(它也存储)。实际上,此转换导致了 QueryInterface 调用:
private object _unkSite;
private IPreviewHandlerFrame _frame;
void IObjectWithSite.SetSite(object pUnkSite)
{
_unkSite = pUnkSite;
_frame = _unkSite as IPreviewHandlerFrame;
}
void IObjectWithSite.GetSite(ref Guid riid, out object ppvSite)
{
ppvSite = _unkSite;
}
IInitializeWithFile 和 IInitializeWithStream 继续,在 FileBasedPreviewHandler 和 StreamBasedPreviewHandler 中分别实现 IInitializeWithFile 和 IInitializeWithStream。调用它们是为了向预览处理程序提供待预览文件的完整路径或 IStream。实现这些方法只需几行代码:
// in FileBasedPreviewHandler
private string _filePath;
void IInitializeWithFile.Initialize(string pszFilePath, uint grfMode) {
_filePath = pszFilePath;
}
// in StreamBasedPreviewHandler
private IStream _stream;
void IInitializeWithStream.Initialize(IStream pstream, uint grfMode) {
_stream = pstream;
}
这些接口中唯一的方法 Initialize 将得到指向待预览文件的路径或代表该文件的 IStream,以及指示如何打开文件的文件模式。文件路径或流存储在成员变量中,以便稍后可以访问它。预览处理程序应当是只读的,因此我忽略了第二个参数。(实际上,所有预览处理程序都应当忽略第二个参数,以只读方式打开文件。并且,它们应当允许执行后续删除、读取和写入文件操作)。IInitializeWithFile 和 IInitializeWithStream 很容易实现,但它们值得我们进行一些深入的讨论。
更多精彩
赞助商链接