制作VB安装程序问答(Package & Deployment)

李海

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

6 、如何制作包括子目录的安装程序

问:我用 VB+Access 开发数据库系统。但到发布时用 VB 自已的发布向导时,我程序目录中的子目录的文件却加入不正常,向导不按子目录区分,都加入程序目录中。怎么办?

答: VB 的安装向导是支持包括子目录的安装程序的。运行安装向导到“文件小节”一步(图 2 ),在对话框中选择“添加”按钮,然后选择应该放置在子目录中的文件添加文件列表中。

2 添加要安装的文件

然后从文件列表中选择该文件,点击 “文件详细资料”按钮。在图3所示对话框中的设置目标路径。最好不要用绝对路径(如C:/MyProject)来指定安装位置,这样会给用户带来不便。安 装向导使用宏来指示文件要安装的位置。这些宏只在安装程序中有效。宏的含义参见表1。如果要将文件放置在应用程序目录下的 /Data 子目录下,可以使用$(AppPath)/Data来指定安装路径

3 设置文件的安装目录

表1 安装向导使用的宏及其含义

含义

$(WinSysPath)

Windows 95/98下的 /Windows/System 子目录,或 Windows NT 下的 /Winnt/System32 目录。

$(WinSysPathSysFile)

Windows 95/98下的 /Windows/System 子目录, 或 Windows NT 下的/Winnt/System32 目录,作为系统文件,当删除应用程序时它不删除

$(WinPath)

Windows 95/98 下的 /Windows 或 Window NT 下的 /Winnt。

$(AppPath)

用户指定的应用程序目录,或 Setup.lst文件中 [SETUP] 部分指定的 DefaultDir 值。

$(ProgramFiles)

应用程序通常所安装到的目录,通常为C:/Program Files

$(CommonFiles)

有时安装共享文件的公用目录,通常为C:/Program Files/Common Files

$(MSDAOPath)

数据访问对象 (DAO) 部件在注册表中的位置,不能用于自己的文件

7 、如何让安装程序在桌面上放一个快捷方式

问:安装时,用 VB 自己的“展开与打包向导”制作安装盘,不知道怎么让程序在桌面上放一个快捷方式?

答: VB “展开与打包向导”所生成的安装程序的工作步骤是这样的:先运行 Setup.exe ,这个程序将 VB 的运行库安装到用户的机器上,同时将 .cab 文件中的文件释放到临时目录中,然后再调用临时目录中 Setup1.exe 完成余下的安装工作。 Setup1.exe 是由 VB 写的 ( 正是这个原因所以要先安装 VB 的运行库 ) ,其源程序可以在 VB98/Wizards/PDWizard/Setup1 中找到。如果你对 VB 的安装程序不满意,希望添加功能,可以直接修改 Setup1.vbp 。具体到你的问题,在 VB 中可以打开 Setup1.vbp ,然后修改 Setup1.frm Form_Load 事件,在其中可以找到如下几行:

'

' Create program icons (or links,i.e. shortcuts).

'

If (fMainGroupWasCreated = True) Or ((cIcons > 0) And TreatAsWin95()) Then

ShowStaticmessageDialog ResolveResstring(resPROGMAN)

CreateIcons gsICONGROUP

'

' Do the same for other sections in SETUP.LST if you've added your own.

'

'CreateIcons "MySection"

'CreateIcons "MyOtherSection"

'

End If

If.. End If 加上

(VB 5.0中)
OSfCreateShellLink "../../Desktop",_ "我的程序",gstrDIR_DEST + "MyProg.exe",""

(VB 6.0中)
OSfCreateShellLink "../../Desktop","",True,"$(Programs)"

重新编译 Setup1.vbp ,用 Setup1.exe 替换掉原来的 Setup1.exe 即可。

8 DEP 文件有什么用

问:用 VB5 的安装向导制作的程序安装包里,总有一个 .DEP 文件,请问这个文件有什么用?是否与 OCX 注册有关?如何打开?如何编辑?

答:只有当你为 ActiveX 控件制作安装包的时候,才会出现 .DEP 文件。这个文件主要是供使用你的 ActiveX 控件的程序设计者制作他自己的程序的安装盘时使用的。你的用户在使用 Setup Wizard 制作安装盘时, Setup Wizard 会读取这个文件,检查你的 ActiveX 控件需要哪些 DLL 支持。一般不用手工修改这个文件,如果你认为确有必要,可以使用记事本打开修改

9 、如何修改安装程序的缺省目录

问:我在做成安装文件后,安装过程中系统缺省的目录是 c:/program files/tele ,而我需要的是 c:/tele2000, 请问有办法修改吗?

答:要修改安装程序的缺省目录,可以打开安装盘的 setup.lst 文件在这文件中可以找到下面一行:

DefaultDir=$(ProgramFiles)/tele

将这行中的“ $(ProgramFiles)/tele 修改为你想要的目录(如 c:/tele2000 )就可以了。

10 、总是显示 $(DllSelfRegisterEx) 不能被注册

问:我用 VB5.0 安装向导生成的安装程序,安装到最后时总是显示文件 c:/windows/system/$(DllSelfRegisterEx) 不能被注册,由于它未找到”的提示信息后安装失败,请问为何原因?

问:这是 VB5.0/6.0 一个 Bug

如果运行 Visual Basic 5.0 生成的安装盘,会产生下面的错误

The file '<Windows System Folder>/$(DLLSelfRegisterEx)' Could not be registered because it was not found.

如果运行 Visual Basic 6.0 生成的安装盘,会产生下面的错误

The file '<TEMP Folder>/Msftqws.pdw/$(DllSelfRegisterEx)' Could not be registered because it was not found.

这个问题发生在分发 Microsoft Calendar control(MSCal.ocx) 时。 MSCal.dep 文件中的 "Register=" 行被错误地设置成 $(DLLSelfRegisterEx) 了。

解决办法如下:

1. 使用记事本打开 Setup.lst 文件 Setup.lst 文件 Setup Wizard PDW 制作安装盘时生成的。

2. 查找 $(DLLSelfRegisterEx) 。你将看到在 MSCal.ocx 的一行中有 $(DLLSelfRegisterEx)

3. 修改 $(DLLSelfRegisterEx) $(DLLSelfRegister)

4. 关闭记事本并保存文件

5. 运行 Setup.exe

如果希望今后生成 setup.exe 都不出这样的错误,可以这样做 :

1. 使用记事本打开 MSCal.dep 文件。你可以在 MSCal.ocx 所在的目录(通常是 Windows 95/98 Windows/System Windows NT Winnt/System32 )找到 MSCal.dep 文件

2. 查找 $(DLLSelfRegisterEx) 。你将可以在 "Register=" 一行看到 $(DLLSelfRegisterEx)

3. 修改 $(DLLSelfRegisterEx) $(DLLSelfRegister)

4. 关闭记事本并保存文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")