# Re: 请问Sun Jack……

Posted by Sun Jack on August 17, 1999 at 14:06:10:

In Reply to: 请问Sun Jack…… posted by Joyce on August 16, 1999 at 08:32:13:

: 请问Sun Jack 如何修改 VB6 的 Setup Kit?

你需要先评估修改Setup Kit 是否对你有益,我先列出三点供你参考:
(1)."An access violation occured while copying the file"是VB6 PDW SP3 的第二严重的Bug,这个 Bug 在VB6原来的版本(未安装 SP3 之前的VB 版本)是排名第一名,虽然在SP3 中有对此Bug 做一些修补的动作,但是仍未彻底解决这个问题,由此可知要解决此Bug 是非常因难,况且这个Bug 所产生的地方,是PDW 中作档案复制最核心的部份,如果修改错误,将会造成安装你的程式的电脑,系统档案毁损(这是真的,我曾做出这种事)
(2).修改Setup Kit 要有心理准备,就是你改好的程式,可能在下一版的Service Pack(如果有的话),Microsoft 因为修改其它的Bug ,把程式码做了调整,造成你所改的部份,转至新的Setup Kit 会有问题,举个例子,在国外,曾经有一些人,合力更改了 SP3 之前的 Setup Kit,但是在 SP3 的 Setup Kit中,Microsoft 把程式码做了一些修改,造成之前所修改的部份都白费了.
(3).Setup Kit 有Bug 的现像存在已久,很多人已改用 InstallShield
(4).Microsoft 也建议用 "Wise Installer"(另一套软体)当作其 Solution

如果你看完上面几点后,仍执意要修改Setup Kit,则修改步骤如下:
(1).用 PDW 产生安装磁片
(2).在你的安装磁片中有一个 Setup.lst,里面有一行
Spawn=Setup1.exe
把这一行改成
Spawn=C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE D:\Program Files\Microsoft Visual Studio\VB98\Wizards\PDWizard\Setup1\Setup1.vbp /cmd
改完后存档,这个目的是告诉Setup Kit ,要叫 VB 的 Source 来Debug,而不是直接执行 Setup Kit 的 EXE
(3).执行你的安装磁片的 Setup.exe,你会看到 VB 的 Setup Kit 的Source 被载入
(4).按F8 开始单步执行
(5). "access violation "的问题是在 basSetup1 中的 CopyFile function 所产生的,但是在你的电脑的上无法模拟出这个状况(因为你的电脑上的 DLL 都是最新的),因此你必须很 "刻意" 的让VB 在处理 MSVCR20.DLL 时,把流程导入需 "OverWrite "此档案的 Source code.
(6).修改 CopyFile function 的部份,因为程式太过复杂,因此我在这里只讲解大方向,首先你先要把 Setup Kit 从cab 档所解出来的 MSVCR20.DLL Copy 至 Temp 目录(需具备如何取得 Temp 目录的技巧,Setup Kit 已提供此Function),
接下来需判断使用者的OS 是 WIN9x 或 Win NT (Setup Kit 已提供此Function).
然后需让系统知道你所 Copy 至 Temp 目录档案,要在下一次开机时, OverWrite 系统的 MSVCR20.DLL,这个部份的作法随着 OS 的不同,而有不同的处理方式(所以会用到上面提到的判断 OS 的Funtion).
在Win 9x 的OS,要设定开机时,将档案 Copy 至另一个地方,可用Windows 目录下的 Wininit.ini 来处理,但是你找不到这个档案,因为开机时,已被 OS 处理过,并改名为 Wininit.bak,如果你幸运的话,会找到 Wininit.bak 这个档案,你可以看看里面的内容,了解一下档案格式.
在Win Nt 上,并不使用 Wininit.ini 这个作法,你需要使用 MoveFileEx API 来处理,
至于这部份程式使用的时机,你在 CopyFile funciton 中,会看到

ElseIf lRC And VIF_FILEINUSE Then
......
ElseIf lRC And VIF_ACCESSVIOLATION Then
.......
ElseIf lRC And VIF_SHARINGVIOLATION Then
.......

上面这几个地方,Setup Kit 原来的作法,只是显示一些 Message ,就是你所提到的错误讯息,你需要改成不显示错讯息,并把流程导入你所增加的程式码

(7).最后,需让Setup Kit 知道,因为你所修改的部份,需重新开机才能生效,因此需让Windows 重新开机(Setup Kit 已提供此Function).
在 basSetup1 的 ExitSetup function,你需要做一点修改,让Setup Kit 知道,当发生所面所处理的状况时,需重新开机(很简单的,Setup Kit 原本只判断安装 MDAC 是否需重新开机,你只要再你的状况也加上去就可以了).

(8).切记:在你边 Debug ,边修改程式时,千万不要在未存档前就让流程跑到 ExitSetup function,否则你就会看到 VB从你眼前消失,你所修改的部份,将会是白费.

Follow Ups: