这个工具用来制作安装程序的确非常方便,除了界面一般点J,可是它还隐藏着一个问题,让程序安装不成功。
我制作了一个软件,打包后进行测试,发现在本人WIN2K和WINXP下可以正常安装,然而在别人的WINXP很少能够正常安装,报告文件找不到,实在让人奇怪。经过一番折腾,终于找到了原因。
使用向导打包后会生成一个CAB文件,安装过程中它需要先将其解压到临时目录然后再安装,我们一般安装WIN2K后默认的用户名就是Administrator,临时目录是Documents and SettingsAdministratorLocal SettingsTemp,而WINXP在安装时会提示输入一个超级用户名称,我想大部分人都是输入自己的中文名吧,临时目录就成了Documents and Settings盛放Local SettingsTemp,而我习惯将临时目录改为我指定的目录M:TEMP,因此出现了在我的机器上安装正常而别人的WINXP下很少能够正常安装的问题。
看来使用VB6自带的打包工具是不行了,只能使用INSTALLSHIELD等第三方工具了,经过比较,发现IS5.0版本也会有同样问题,而IS7似乎不能在WIN98下使用,所以建议使用INSTALLSHIELD6.X版本(不过6.1版本自带的微软数据访问组件版本为2.0,可以复制MDAC_TYP2.5覆盖它)。
当然不是说Package & Deployment 向导就一点用处也没有,我先通过它进行打包,然后根据产生的SETUP.LS文件找到相关文件以及注册信息,然后再和使用INSTALLSHIELD解析VB6工程文件生成的文件列表进行比较,毕竟这是VB6自带的工具,还是值得信赖的:)。
这个工具本来一直使用比较正常,但是有一次我做VB6程序,中间有调用一个DLL,VB6居然报告DLL文件找不到(我为了方便调试,VC6生成DLL直接指向那VB6工程目录,然后从资源管理器中打开工程),和以前不同的操作是使用了一个文件选择对话框,打开了另外一个逻辑盘的文件,估计是改变了WINDOWS的当前目录,为了验证一下,准备调用API函数检测。
打开API 文本浏览器,复制Private Declare Function GetCurrentDirectory Lib"kernel32" Alias "GetCurrentDirectory" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long函数申明,首先发现该函数别名上没有加A,复制到VB后变成了Private Declare Function GetCurrentDirectory Lib "kernel32" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long,觉得有点奇怪。也没有理会。
输入代码:
Dim s As Strings = String(255, 0)
Dim i As Integer
i = GetCurrentDirectory(255, s)
Debug.Print Left(s, i)
一运行,居然报告找不到DLL入口点!
看来是需要加上别名了,果然,改为Private Declare Function GetCurrentDirectory Lib "kernel32" Alias "GetCurrentDirectoryA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long后程序就可以了。
(VB程序进程的当前目录一般不会更改,但是如果程序自己使用了文件选择对话框等,那么就会改变了当前路径)
看来这个API浏览器中有些函数会丢失一些字母,需要我们手工添加。我把文本转成MDB数据库,用SQL查询了一下,大约有1000个函数的别名和原名一致,当然,大部分没有别名也是可以正常执行的。