CSDN博客

img FANGAO

InstallShield内部库函数之21 版本检测函数

发表于2001/6/24 10:16:00  1316人阅读

InstallShield内部库函数之21  版本检测函数
    下列函数允许你访问存在于Windows 95及更高版本的文件中的版本信息。为使用这些函数,你需要知道有关版本资源的背景信息。查阅Microsoft Windows Programmer's Reference, Volume 4:资源手册来更好得了解版本资源。函数说明假定你完全熟悉版本资源的概念。
   下列函数获得一个具体文件的版本,找到一个文件并得到它的版本,或查找一个存在的文件和试图安装该文件的一个更新的版本。函数可工作于压缩文件或未压缩文件。
VerCompare
比较包含版本信息的两个字符串。
VerFindFileVersion
查找指定文件并检索它的版本和位置。
VerGetFileVersion
检索一指定文件的版本。
VerSearchAndUpdateFile
用一个更新的版本置换一个存在的文件。如果指定的文件不存在,则安装更新的版本。
VerUpdateFile
用一个更新的版本置换一个存在的文件。如果指定的文件不存在,则不安装更新版本。
21.1  VerCompare
语法:VerCompare (szVersionInfo1, szVersionInfo2, nCompareFlag);
说明:VerCompare函数比较两个包含版本信息的字符串。
参数:
szVersionInfo1
以下列格式指定第一个版本字符串:
主版本号.次版本号
如果szVersionInfo1是2.1.2.0,主版本号是2.1,次版本号是2.0。
szVersionInfo2
以相同格式指定第二个版本字符串。
nCompareFlag
传递预定义常量VERSION来指定进行版本号的比较。该参数不允许其它值。
返回值:
EQUALS (2):表明两个字符串有相等值。
GREATER_THAN (0):表明第一个字符串包含的值大于第二个。
LESS_THAN (1):表明第一个字符串包含的值小于第二个。
21.2  VerFindFileVersion
语法:VerFindFileVersion (szFileName, svPath, svVersionNumber);
说明:VerFindFileVersion函数查找一个指定的文件并检索文件版本和位置。VerFindFileVersion使用下列查找算法来找到文件:
首先,它查找Windows 文件夹。
接着,Windows 系统文件夹。
接着,由系统变量TARGETDIR指定的文件夹。
接着,由环境变量PATH指定的文件夹。
最后, Setup.exe运行所在的文件夹。
有关Windows 系统文件夹的信息,请查看InstallShield系统变量WINSYSDIR的文档。
参数:
szFileName
指定要获得其版本的文件的非限定名。不要在该参数位置指定一个驱动器指示符或路径。
svPath
返回文件所在的文件夹的完整路径(包含驱动器指示符)。
svVersionNumber
返回下列格式的文件版本号:
主版本号.次版本号
如果szVersionNumber返回2.1.2.0,则主版本号是2.1,次版本号是2.0。
返回值:
0:表明函数成功返回版本信息。
FILE_NO_VERSION (-8):表明文件被找到但不包含版本信息。
FILE_NOT_FOUND (-2):表明文件未能找到。
注解:
·当使用VerFindFileVersion时,你可能需要为TARGETDIR设置一个值,而不是让InstallShield自动设置它。因为函数在TARGETDIR文件夹中寻找文件,你可能需要临时设置系统变量来确保VerFindFileVersion会找到该文件。如果你要这么做,在将TARGETDIR的值临时设置为另一个文件夹前使用VarSave来保存该值。
21.3  VerGetFileVersion
语法:VerGetFileVersion (szFileName, svVersionNumber);
说明:VerGetFileVersion函数检索指定文件的数值型版本信息。
参数:
szFileName
指定其数值型版本信息要被检索的文件的全限定名。
svVersionNumber
以下列格式的字符串返回文件数值型版本号信息:
主版本号.次版本号
如果szVersionNumber返回2.1.2.0,则主版本号是2.1,次版本号是2.0。
返回值:
0:表明函数成功返回版本信息。
FILE_NOT_FOUND (-2):表明指定文件未能找到。
FILE_NO_VERSION (-8):表明文件被找到但不包含版本信息。
注解:
·值得注意的是,虽然InstallShield 文件版本信息以字符串格式出现,它们所指示的一个文件的版本信息是数值型版本信息。一个文件的字符串版本信息是不能由InstallShield函数检查到和返回的。而且,你必须注意当Windows 资源管理器显示一个文件的属性时,它显示字符串版本信息,可能与文件数值型版本信息不等。因为这个原因,由VerGetFileVersion在参数svVersionNumber返回的值可能与Windows 资源管理器显示的版本信息不匹配。
·有关文件版本信息的更多情况,可查询Windows SDK或Win32 SDK。
21.4  VerSearchAndUpdateFile
语法:VerSearchAndUpdateFile (szFileName, nUpdateFlag, svInstalledFile);
说明:VerSearchAndUpdateFile函数查找指定的文件并在必要时安装该文件的一个更新版本。如果该函数找到该文件,它比较现存文件的版本号和新文件的版本号。如果现存文件是旧的,它被新文件替换。新文件必须在由系统变量SRCDIR指定的目录中。如果函数未找到一个现存文件,它就拷贝新文件到目标系统。Microsoft Windows根据文件类型决定文件安装在哪里。例如,.dlls和系统驱动器被安装在Windows 系统文件夹中。有关Windows 系统文件夹的信息,请查阅InstallShiled 系统变量WINSYSDIR的文档。
VerSearchAndUpdateFile使用下列查找算法来找到现存文件:
请参阅VerFindFileVersion中的查找算法。
参数:
szFileName
指定要安装的文件的未限定名。不要在该参数位置指定一个驱动器指示符或路径。
nUpdateFlag
指示是否该文件要被无条件更新或仅当在目标系统上找到的文件版本比你现有的文件版本旧时才更新。在该参数位置传递下列预定义常量之一:
VER_UPDATE_COND:仅当现存文件是一个旧版本时才更新它。
VER_UPDATE_ALWAYS:即使现存文件是一个更新的版本也要更新它。
svInstalledFile
返回由该函数安装的文件的全限定名。如果你要置换的文件正在使用,则文件以一个轻微差异的名称被安装到相同目录。文件以其扩展名的第一个字符为~字符来更名。例如,如果你安装文件Shell.dll并且文件是锁定的,则该文件被拷贝为Shell.~ll。文件名从该变量返回。
返回值:
FILE_INSTALLED (0):函数成功安装文件。
FILE_IS_LOCKED (-4):表明文件正在被Windows 使用并且不能被置换。新文件以一个新名字被拷贝到相同目录。
FILE_NO_VERSION (-8):表明文件被找到,但它不包含版本信息。文件更新没有执行。
FILE_RD_ONLY (-5):表明现存文件是写保护的。脚本必须在进行安装之前重新设置目标文件的只读标志,然后再尝试安装文件。
FILE_SRC_OLD (-7):表明要安装的文件有相同的日期或比先前存在的文件更早。
OUT_OF_DISK_SPACE (-6):表明函数因为目标驱动器上磁盘空间不足,未能创建文件。文件更新没有执行。
VER_DLL_NOT_FOUND (-3):表明没有找到Ver.dll。文件更新没有执行。
OTHER_FAILURE (-1):表明发生一个不确定错误。文件更新没有执行。
注解:
·使用VerSearchAndUpdateFile时,你可能需要给SRCDIR和/或TARGETDIR设置值,而不是让InstallShield自动设置它们。因为函数在SRCDIR和 TARGETDIR文件夹中查找文件,你可能需要临时重新设置这些系统变量的值来确保VerSearchAndUpdateFile会找到文件。如果你需要这么做,则在将SRCDIR 和 TARGETDIR临时设置为其它值之前使用VarSave来保存它们的值。调用VerSearchAndUpdateFile函数后,使用VarRestore来重新设置SRCDIR 和TARGETDIR。
·对于文件传输,VerSearchAndUpdateFile的可能的替换函数是XCopyFile,,它可以做版本检测,标记锁定的.dll和.exe文件待系统重启后更新,并且递增共享的.dll和.exe文件的注册表访问计数器。
21.5  VerUpdateFile
语法:VerUpdateFile (szFileName, nUpdateFlag, svInstalledFilePath);
说明:VerUpdateFile函数使用一个指定文件的版本信息来确定是否要在目标系统上安装该文件。VerUpdateFile在参数szFileName位置得到文件名。如果在szFileName没有指定一个全限定名,VerUpdateFile使用下列查找算法来找到该文件(目标文件):
请参阅VerFindFileVersion的查找算法。
  VerUpdateFile然后将SRCDIR中相同名称的文件的版本和目标文件(如果存在)的版本进行比较。如果源文件的版本号比目标文件的版本号更新,则目标文件被置换为该源文件。如果目标文件不存在,InstallShield拷贝源文件到目标文件。
  当在参数nUpdateFlag位置是SHAREDFILE 或 LOCKEDFILE选项,并且要被更新的.dll或.exe 文件正在被系统使用时,源文件的更名拷贝传输到目标系统并且系统变量BATCH_INSTALL设置为TRUE。然后,当在安装结尾调用RebootDialog或 SdFinishReboot并且系统重启时,锁定文件被更新。有关更新锁定文件的更多信息请查阅RebootDialog 和SdFinishReboot。系统变量BATCH_INSTALL可以被测试来确定是否遇到锁定的.dll或.exe文件。你不能同时使用SHAREDFILE 和 LOCKEDFILE选项,你必须使用一个或另一个。
参数:
szFileName
指定要被更新的文件的全限定名或非限定名。如果该名是非限定的(也就是,如果它不包括一个驱动器指示符或路径),InstallShield查找Windows 或Win95目录,系统目录,由环境变量PATH指定的目录,然后是InstallShield可执行文件的目录来找匹配文件。VerUpdateFile取szFileName的文件名部分,并用它来标识SRCDIR中作为源文件的文件。
nUpdateFlag
指示是否该文件要被无条件更新或仅当在目标系统上找到的文件版本比你的源文件版本早时才更新。在该参数位置传递下列预定义常量之一。你可以用按位或操作符(|)将常量SHAREDFILE和其它常量之一组合。你不可将SHAREDFILE 和 LOCKEDFILE组合。
LOCKEDFILE:使VerUpdateFile标志Windows 或系统重启时要被更新的.dll 和.exe文件。一个锁定文件是一个当InstallShield试图要访问或更新时而正在被一个应用程序或系统使用的文件。LOCKEDFILE选项和 SHAREDFILE一样工作,除了LOCKEDFILE不创建注册表表目或修改注册表访问计数器。你使用SHAREDFILE选项时不能使用LOCKEDFILE选项。有一些非共享文件,对它们脚本作者不要注册表表目和访问计数器。这些文件除非由应用程序本身,否则永不被安装。LOCKEDFILE允许VerUpdateFile处理非共享的锁定文件。
SHAREDFILE:可以通过用VerUpdateFile将所有文件处理为共享,并标志Windows 或系统重启时要被更新的锁定的.dll 和.exe文件,来组合共享和锁定文件的处理。
当文件存在于目标目录并且它有一个大于0的访问计数器时,SHAREDFILE选项使VerUpdateFile处理所有文件为共享文件并将注册表访问计数器加一。如果共享文件不存在于目标目录并且它没有访问计数器时,InstallShield创建该计数器并把它设置为1。如果共享文件已经存在于目标目录但没有访问计数器时,InstallShield创建该计数器并把它初始化为2,作为一个防止安装过程中意外删除的预防措施。
SELFREGISTER
当使用"非批处理方法"安装自注册文件时,立即进行自注册处理。
当你已经调用Enable(SELFREGISTERBATCH),自注册文件排队等待注册。
当使用"批处理方法"安装自注册文件时,一旦调用Do(SELFREGISTRATIONPROCESS),这些文件被注册。
总是将SELFREGISTER和常量SHAREDFILE用按位或操作符组合一起使用。
VER_UPDATE_ALWAYS:更新文件时不考虑版本号。
VER_UPDATE_COND:仅当被替换的文件是旧版本时才更新它。
svInstalledFilePath
返回安装的文件的全限定名。如果你想要置换的文件正在被使用,文件以一个更改名安装到相同目录。InstallShield使用一个~字符来置换文件扩展名的第一个字符。
例如,如果你在更新文件Shell.dll并且目标文件是锁定的,则源文件以Shell.~ll被拷贝到目标目录。文件名从参数svInstalledFilePath返回。
如果SHAREDFILE选项使用到参数nUpdateFlag并且锁定文件当Windows 或系统重启时被正确递交来更新,则发生更新时文件的~更名版本被删除。
返回值:
FILE_INSTALLED (0):表明函数成功安装文件。该常量等于0。所有其它返回值小于0。
FILE_IS_LOCKED (-4):表明现存的文件正被Windows使用,不能被置换。新文件以一个新名被拷贝到相同目录,如前面所述。
FILE_NO_VERSION (-8):表明文件被找到,但它不包含版本信息。不执行文件更新。
FILE_RD_ONLY (-5):表明现存文件是写保护的。你必须在进行安装之前重新设置目标文件的只读位,然后再尝试安装文件。
FILE_SRC_EQUAL (-9):表明你要安装的文件和现存文件有相同版本。如果VER_UPDATE_COND标志被设置,则不执行文件更新。
FILE_SRC_OLD (-7):表明你要安装的文件比现存文件要早。如果VER_UPDATE_COND标志被设置,则不执行文件更新。
OUT_OF_DISK_SPACE (-6):表明函数未能创建文件,因为目标驱动器上磁盘空间不足。不执行文件更新。
-51:一个自注册文件未能成功注册。
OTHER_FAILURE (-1):表明发生不确定错误。不执行文件更新。
注解:
·在调用任何使用SHAREDFILE选项的函数前,必须使用InstallationInfo来设置应用程序信息,并且必须使用DeinstallStart函数设置卸载信息。
·当使用VerUpdateFile时,你可能需要为SRCDIR设置一个值,而不是让InstallShield自动设置它。因为函数在SRCDIR文件夹中寻找文件,你可能需要临时设置系统变量来确保VerUpdateFile会找到该文件。如果你要这么做,在将SRCDIR的值临时设置为另一个文件夹前使用VarSave来保存该值。调用VerUpdateFile函数后,使用VarRestore来重新设置SRCDIR。
·对于文件传输,VerSearchAndUpdateFile的可能的替换函数是XCopyFile,,它可以做版本检测,标记锁定的.dll和.exe文件待系统重启后更新,并且递增共享的.dll和.exe文件的注册表访问计数器。
0 0

相关博文

我的热门文章

img
取 消
img