首页 目录页 热情软件屋 问专家

李海文选

制作VB安装程序问答(一)

李海

本文发表在2000年4月17日 《计算机世界》25期

制作安装程序往往是程序设计的最后一步,同时也是重要的一步,因为运行安装程序往往是用户的第一个操作。下面就介绍一些制作Visual Basic安装程序时常遇到问题的解决方法。

1、一个非常简单的VB程序是否可以不制作安装程序

问:假如我的VB5开发的程序很简单,只用到了ShellExecute()这个API 以及Command Button,我能不能不做安装盘,在所有客户机器上(WIN95/98/NT)都能正常使用程序?如不制作安装程序,与EXE放一起的应该包括哪些文件?

答:对于一个非常简单的VB5程序,没有使用额外的OCX控件,在Win98/2000下是可以正常运行的,而不需要制作安装盘。因为Win98/2000带有VB5程序所需要的DLL文件。但在Win95/NT 4.0下一般是不行的,因为缺少必要的文件。如果用户的机器上安装有IE 4.0/5.0,那么应该也是可以不制作安装盘的。在一般情况下,不制作安装盘就不不能保证程序的正确运行。你制作的安装盘所包括的DLL中,除了Vb5stkit.dll只是安装时使用,安装后就不需要了,其他DLL都是不可缺少的。虽然对于某些机器而言,由于安装过其他软件,可能不需要某个DLL,但要想在所有的机器上都正确运行,一个文件都不能少。所以为了避免由于缺少某个文件或注册不正确而使程序无法运行,我建议你还是制作安装盘比较保险。如果你的程序是放在网上供别人下载的,为了减少下载文件的大小,可以这样做:将你的程序单独打成一个包,如果用户已经有了运行VB5程序所需要的有关文件,就只需下载你的程序;然后,在网页上提供一个VB5的运行时间库的链接(如http://download.microsoft.com/download/vb50pro/utility/1/win98/EN-US/Msvbvm50.exe),如果用户的机器上没有这些文件,让它单独下载运行库。这是一种比较通行的方法。

2、是否一定要注册ActiveX控件

问:若在一个程序中使用了其他的控件, 如何在没有注册该控件的机器上运行, 是不是一定要制作安装程序或注册该控件呢?

答:在Win95/98下,如果你的控件和EXE文件在同一个目录中,或者控件文件放置在System目录中,EXE程序运行时会自动找到所需要的OCX文件并注册。但是这种方法在WinNT下不适用,NT下必须先注册控件才能保证EXE程序的正常运行。另外,这种自动注册有一些毛病,如果机器已经存在一个低版本的控件,自动注册可能会失败。所以,如果你希望自己的程序能够非常好地工作,最好还是制作安装程序,否则可能会有麻烦。

3、如何利用VB6给自己的软件加上卸载功能

问:请介绍一下如何利用VB6给自己的软件加上卸载功能,即象购买的软件一样的卸载功能?

答:VB6的安装向导制作的安装程序本身包括卸载功能,不过这个功能并不出现在“开始”菜单中。安装后,要进行卸载工作,可以打开“控制面板”,点击“安装/删除程序”图标,然后选择想要卸载的软件。

如果希望在菜单中添加选项,可以在制作安装程序包时加入相应的程序项。VB6的“Package & Deployment 向导”支持安装程序创建自己的程序组和菜单项。在“Package & Deployment 向导”的“启动菜单项”一步(图1),选择“新建项”按钮,此时会出现一个对话框。在对话框的 “名称”文本框中输入菜单项的名称,如“卸载VBTERM”。在“目标”框中输入卸载项的命令为:$(WinPath)\st6unst.exe -n "$(AppPath)\ST6UNST.LOG" 。然后选择确定关闭该对话框。这样生成的安装程序中将包括一个卸载程序的菜单项。

1 在启动菜单项中添加一个卸载项

4、程序错误:can not fond 'c:\windows\temp\msftqws.pdw\st6unst.ext'

问:本人用VB6.0制作了一个程序,但在某个机器上安装时,会出现以下错误:

1.system error &H80004005(02147467259) 未指定错误”

2.can not found 'c:\windows\temp\msftqws.pdw\st6unst.ext'

3.无法开始系统安装程序。

答:这是由于VB6的一个BUG导致的,你可以升级到VB6 SP3(从http://msdn.microsoft.com/vstudio/sp/default.asp下载),在这个升级版本中修复了这个错误。

5、安装软件时报告DLL中没有发现DllRegisterServer

问:本人用VB 6制作了一个程序,但在安装这软件是时系统报告:

错误: 'C:WINDOWS\SYSTEM\expsrv.dll' 中未发现 DllRegisterServer() 的\WINDOWS\SYSTEM\expsrv.dll"输入点

*** 在本操作期间: DllSelfRegister: "C:

*** 错误: 注册文件 'C:\WINDOWS\SYSTEM\expsrv.dll' 时出错

*** 错误: (用户响应 '忽略')

忽略错误后安装完成。在WINDOWS 98 下安装已有同样的问题。

答:DLL有两种,一种是标准DLL,另一种是ActiveX DLL。前者拷贝到用户机器上就可以工作了,而后者还需要调用DLL中的DllRegisterServer或者使用RegSvr32进行注册才能使用。你可以打开VB98\Wizards\PDWizard\VB6dep.ini文件。下面是这个文件的片断:

[ExpSrv.dll]

Dest=$(WinSysPathSysFile)

CABFileName=MSJet35.cab

CABDefaultURL=http://activex.microsoft.com/controls/vb6

CABINFFile=MSJet35.inf

[MSRD2x35.dll]

Dest=$(WinSysPathSysFile)

Register=$(DLLSelfRegister)

CABFileName=MSJet35.cab

CABDefaultURL=http://activex.microsoft.com/controls/vb6

CABINFFile=MSJet35.inf

你可以看到MSRD2x35.dllExpSrv.dll多一行Register=$(DLLSelfRegister),这是因为MSRD2x35.dllActiveX DLLExpSrv.dll是普通的DLL,没有DllRegisterServer,也用不着注册。你所遇到的问题是VB6的一个BUG(在VB6 SP3中已经修复)。如果你VB6dep.ini文件的ExpSrv.dll多了Register一行,应该删除。或者打开安装程序的Setup.lst,删除其中ExpSrv.dll一行中的“$(DLLSelfRegister)”字样。

第2部分

回到《李海文选》目录

如果您有任何建议,请给我发电子邮件:
版权所有 李海,热情软件屋 1997-2006

WU Banner from WebUnion Chinese Network