快速查看执行和错误条件

【勇芳软件工作室】汉化HomePreviousNext

Quick View程序的每个实例的生命周期包括以下步骤:

1.当用户选择快速查看或打印命令时,shell会为每个选定的文件启动一个QUIKVIEW.EXE实例(通过使用Win32 【】 【】WinExec功能)。shell可以指定show命令,Quick View将该命令传递给文件查看器。shell传递给Quick View的命令行参数有以下选项。

选项含义
-f:【路径】查看或打印文件的路径。允许通用命名约定(UNC)文件名。如果未指定此选项,则快速查看将终止而不显示任何消息。
-v要在文件查看器中打开查看的文件。如果指定了此选项,Quick View将忽略以下所有选项。如果没有-v-p,则这是默认选项。
-d快速查看和文件查看器可以禁止所有用户界面(UI)元素,如果-p也被指定。快速查看禁止任何错误消息,文件查看器不应显示任何打印对话框。在没有-p 【.】的情况下,快速浏览会忽略此选项
-p要打印的文件进行打印。如果-v也存在,Quick View将忽略此选项。
-&:【路径】打印机驱动程序用于打印文件。在没有-p的情况下,快速查看会忽略此选项。如果-p存在但-&不存在,则“快速浏览”指示文件查看器使用默认打印机驱动程序。

2.Quick View启动并检查命令行中的路径。如果没有路径,用户自己尝试启动快速查看,程序立即终止,而不显示任何消息。

3.Quick View从-f选项中给出的路径解析文件扩展名。如果没有提供文件扩展名,Quick View进入阶段E1(错误条件1)。否则,快速查看使用以下过程来查找与给定文件扩展名关联的文件查看器类标识符。

a.Quick View尝试打开HKEY_CLASS_ROOT \\ QuickView \\ 【延期】键,其中【延期】从路径中解析出来。

i.If the filename extension maps to a type such as HKEY_CLASS_ROOT\【延期】 = 【类型名】 and there is a registry entry with the form HKEY_CLASS_ROOT\【类型名】\QuickView = *, Quick View looks for file viewer class identifiers under HKEY_CLASS_ROOT\QuickView\*. If a key with the HKEY_CLASS_ROOT\*\QuickView = * form exists, the system attempts to use all the viewers listed under the "*" section.
ii.否则,快速查看开始枚举HKEY_CLASS_ROOT \\ QuickView \\ 【延期】键下的文件查看器类标识符。如果枚举失败(即注册表中没有枚举),快速查看将关闭密钥并进入E2阶段。否则,快速查看将在枚举中读取第一个文件查看器类标识符,并进入步骤4。

b。如果在步骤4发生错误,则枚举继续,直到所有文件查看器类标识符都被尝试。如果没有文件查看器被激活,Quick View将关闭(a)中的密钥,并进入E2阶段。

4.获取文件查看器DLL的类标识符,Quick View会尝试使用以下过程创建给定类的文件查看器对象的实例。

a.Quick View调用函数来创建文件查看器对象的实例,指定包含类标识符和IID_IPersistFile接口标识符的参数。这指示OLE加载类标识符InprocServer32子项下列出的DLL,从DLL获取对象的实例,并返回一个IPersistFile接口指针到该对象。如果由于内存不足而无法创建实例,则快速浏览进入阶段E4。如果由于某些其他原因而失败,Quick View进入E3阶段。(请注意,由于涉及到DLL对象,所以任何调用QueryInterface都不会失败,REGDB_IID_NOTREG通常会导致注册表损坏。该错误仅在涉及LRPC代理和存根时生成。)

b.Giving IPersistFile接口指针【pIPersistFile】,Quick View调用IPersistFile接口的加载成员函数,指定文件的路径和STGM_READ和STGM_SHARE_DENY_NONE值,指示对象打开文件用于读取访问。如果加载失败,Quick View会调用发布成员函数【pIPersistFile】,如果错误是由于内存不足而进入阶段E4。否则,快速浏览进入E3阶段。

c.Quick View通过在【pIPersistFile】 QueryInterface成员函数的调用中指定IID_IFileViewer接口标识符来获取文件查看器对象的IFileViewer接口。不管结果如何,Quick View都会调用发布发布成员函数。如果此通话由于内存不足而失败,则快速浏览进入到E4阶段。否则,快速浏览进入E3阶段。

d1.如果-v选项存在,或者-v 【】-p选项不存在,Quick View会调用ShowInitialize 【pIFileViewer】的成员函数,该函数指示文件查看器加载文件并执行容易发生故障(包括创建窗口,加载资源等)的任何预置位初始化。这是文件查看器失败的机会。如果失败,如果错误是由于缺少内存而导致的,则“快速浏览”将进入阶段E4,否则会导致阶段E3。如果ShowInitialize成功,Quick View会调用显示 显示显示成员函数,指定传递给快速查看的WinMain函数的show命令。显示不会返回,直到用户关闭文件查看器,并且在这种情况下它总是返回NOERROR。如果显示ShowInitialize之前调用,则返回E_UNEXPECTED。

d2.如果存在-p选项(并且-v选项不存在),则Quick View会调用【pIFileViewer】PrintTo成员函数,指定-&选项中提供的打印机驱动程序的路径(或如果-&不存在),则为空,并且指示命令行(UI抑制标志)是否存在-d选项的值。PrintTo不会返回,直到打印完成或发生错误。如果发生错误,则文件查看器负责通知用户,如果UI抑制标志为FALSE 【.】

e。当显示 【】PrintTo 【】返回(以d1或d2为准)时,无论返回值如何,Quick View都会调用【pIFileViewer】发布成员函数。如果文件查看器成功执行IFileViewer::ShowInitialize成员函数,发布成员函数将不会失败。发布只有在ShowInitialize之前调用才会失败。如果PrintTo 【】失败,但在命令行上未指定-d选项,则Quick View会假定文件查看器显示一条消息以指示打印失败,并且快速查看失败,而不显示此消息。无论如何,快速浏览进入步骤5。

5.Quick View发布它可能已经拥有并调用OleUninitialize的任何接口指针。快速查看然后正常终止。

在实例的生命周期内,快速浏览可能会遇到这四个错误条件(阶段E1至E4)。

E1.如果快速查看无法将路径与文件查看器类标识符(使用文件扩展名)相关联,则会显示此消息。

没有这种类型的文件的观众。你想尝试默认的观众。

如果用户点击No,Quick View就会终止。如果用户单击“是”,“快速查看”显示“搜索”对话框,列举所有已注册的文件查看器(无论文件类型或文件扩展名),并尝试将每个文件加载并显示文件。快速查看尝试每个文件查看器一个给定的类标识符一次。如果没有文件查看器成功显示该文件,快速浏览将删除“搜索”对话框并显示此消息。

打开或读取文件时出错。

当用户关闭对话框时,Quick View终止。

E2.如果快速查看成功确定文件类型,但无法枚举与文件扩展名相关联的任何文件查看器,则会显示“搜索”对话框,并尝试让每个注册的查看器显示该文件,尝试每个文件查看器类标识符一次。如果失败,快速视图将删除“搜索”对话框并显示此消息。

没有观众能够查看<可读取的文档类型>文件。

当用户关闭对话框时,Quick View终止。

E3.如果快速查看成功找到一个初始文件查看器,但由于出现内存不足状况的原因,无法查看该文件,“快速查看”显示“搜索”对话框,并继续枚举目前使用的类标识符或文件扩展名下的查看器(步骤3d或4c)。如果快速查看尝试注册类型失败的所有观众,处理将继续进行阶段E2尝试所有注册的观众,不管注册类型。

E4.如果一个文件查看器出现内存不足情况,其他的查看者很可能也不会成功。在这种情况下,Quick View会显示一个对话框(使用MB_ICONEXCLAMATION),并显示此消息。

没有足够的内存来查看或打印<文件名>.退出一个或多个文件或程序,然后重试。

文件查看器可以将许多错误值返回到快速查看。当Quick View收到错误值时,会显示错误消息。快速浏览识别以下错误值。

FV_E_BADFILE((HRESULT)0x8534E102L)
FV_E_EMPTYFILE((HRESULT)0x8534E108L)
FV_E_FILEOPENFAILED((HRESULT)0x8534E105L)
FV_E_INVALIDID((HRESULT)0x8534E106L)
FV_E_MISSINGFILES((HRESULT)0x8534E104L)
FV_E_NOFILTER((HRESULT)0x8534E100L)
FV_E_NONSUPPORTEDTYPE((HRESULT)0x8534E101L)
FV_E_NOVIEWER((HRESULT)0x8534E10AL)
FV_E_OUTOFMEMORY((HRESULT)0x8534E107L)
FV_E_PROTECTEDFILE((HRESULT)0x8534E109L)
FV_E_UNEXPECTED((HRESULT)0x8534E103L)