使用版本信息

安装程序通常具有以下目标:

  • 将文件放置在正确的位置。
  • 在安装程序将现有文件替换为明显不同的版本时通知用户,例如,将德语文件替换为英语文件,或将较新的文件替换为较旧的文件。

编写安装程序时,必须为每个文件提供以下信息:

  • 文件的名称和位置 (称为源文件) 。
  • 用户硬盘上等效文件的名称 (称为目标文件) 。 此名称通常与安装磁盘上的文件名相同。
  • 文件的共享状态,即文件是专用于正在安装的应用程序,还是可由多个应用程序共享。

安装程序可以使用 VerFindFile 函数来确定文件应在磁盘上复制的位置。 此函数还可用于指定文件是专用于应用程序还是可共享。 如果在查找文件时出现问题, VerFindFile 将返回错误值。 例如,如果系统正在使用目标文件, VerFindFile 将返回 VFF_FILEINUSE。 安装程序必须通知用户该问题,并响应用户决定继续或结束安装。

VerInstallFile 函数将源文件复制到 VerFindFile 指定的目录中的临时文件。 如有必要, VerInstallFile 使用数据解压缩库中的函数扩展文件。

VerInstallFile 将临时文件的版本信息与目标文件的版本信息进行比较。 如果两者不同, VerInstallFile 将返回一个或多个错误值。 例如,如果临时文件早于目标文件,则返回 VIF_SRCOLD ;如果文件具有不同的语言标识符或代码页值,则 返回VIF_DIFFLANG 。 安装程序必须通知用户该问题,并响应用户决定继续或结束安装。

某些 VerInstallFile 错误是可恢复的。 也就是说,安装程序可以再次调用 VerInstallFile (指定 VIFF_FORCEINSTALL 选项)来安装文件,而不考虑版本冲突。 如果 VerInstallFile 返回 VIF_TEMPFILE 并且用户选择不强制安装,则安装程序应删除临时文件。

VerInstallFile 在尝试强制安装时可能会遇到不可恢复的错误,即使以前不存在该错误。 例如,在安装程序尝试强制安装之前,该文件可能被另一个用户锁定。 如果安装程序尝试在发生不可恢复的错误后强制安装, VerInstallFile 会失败。 安装程序必须包含例程才能从此类错误中恢复。

建议的解决方案是显示一个对话框,其中包含“安装”、“跳过”和“全部安装”按钮。 (另一个解决方案是一个对话框,其中包含按钮“是”、“全部跳过”、“跳过”和“取消”。) “全部安装”按钮应防止安装程序通过在 VerInstallFile 的所有后续使用中包含 VIFF_FORCEINSTALL 选项来提示用户出现类似错误。 对于不可恢复的错误,应禁用“ 安装 ”和“ 全部安装 ”按钮。

若要向用户显示有用的错误消息,安装程序通常必须从冲突文件的版本资源中检索信息。 安装程序可以使用四个函数实现此目的:

GetFileVersionInfoSize 返回版本信息的大小。 GetFileVersionInfo 使用 GetFileVersionInfoSize 检索包含版本信息的结构。 VerQueryValue 从该结构中检索特定成员。

例如,如果 VerInstallFile 返回 VIF_DIFFTYPE 错误,则安装程序应对临时文件和目标文件使用 GetFileVersionInfoSizeGetFileVersionInfoVerQueryValue 函数来获取每个文件的常规类型。 如果文件的语言冲突,安装程序还应使用 VerLanguageName 将二进制语言标识符转换为该语言的文本表示形式。 (例如,0x040C转换为字符串“French”。)

如果 VerInstallFile 返回文件错误(如 VIF_ACCESSVIOLATION),则安装程序应使用 GetLastError 函数来检索最新的错误值。 程序应将此值转换为要向用户显示的信息性消息。 程序不得在对 VerInstallFileGetLastError 的调用之间产生控制权。