admin管理员组

文章数量:1566354

这篇文章的内容其实是二十几年前的事了。那是我大三时候的假期,家里多不容易买的电脑,配置还记忆犹新:三星550b显示器,技展机箱,赛扬500,pc13364G内存,捷波994主板,迈拓2M缓存10G硬盘,1.44软驱,小辣椒声卡,小影霸显卡,光驱……一共6040元。为了对得起这份投入,假期自己在家尝试做了几个小程序,都说pb适合数据库,我偏偏做了两个纸牌游戏……如果哪位朋友有兴趣,可以看我另一篇博客:

PowerBuilder制作纸牌游戏_大橘的博客-CSDN博客

那一年还因此获得了校级优秀成果奖。(对比人家linus,其实挺惭愧的。差远了。)

当时我做了四个程序,三个pb开发,一个vb开发。我也想做得像大神一样有好用的setup,但是vb自带那个确实不够完善,于是我使用了wiseinstaller,据说被誉为“安装圣手”。这家伙最吸引我的,是可以以本机为参照,定制目标机的文件、快捷方式、注册表。而且还可以把安装文件制作成若干个,类似winzip分盘压缩一样。

而这篇文章要说的,是共享库的发布问题。也就是说,在目标机上安装我做的程序,可以通过安装程序自动完成部署过程,以及配置ODBC。而且其效果是安装顺畅,卸载干净,没有垃圾,ODBC驱动和数据源的配置和系统自带的一样完善,卸载一样干净。全部自动完成。

我使用的开发和测试环境是win98和win2000,那时候没有虚拟机的概念,机器上装双系统,来回启动切换。如果想模拟真实的测试环境,还要无数次重装系统。而且,库依赖这个问题,我没有太多的参考资料,课上老师也只是讲得很浅。所以我是把pb的share目录下的文件一个个试出来的!

那时候所谓56k猫拨号上网,费用极大,速度超慢。能使用网络蚂蚁下载一个十几兆的文件,都是奢望。而且闭门造车,又没有人带。所以在当时付出的努力今天不可想象!

我记着,pb开发的程序,有两个最基本的文件一定要有,pbvm*.dll和libjcc.dll。如果用到sybase数据库,还要有个好像叫Deng的可执行程序作为引擎(也就是每次启动数据库,右下角那个红色的图标程序)。而这个引擎程序的运行,又需要若干dll。还需要odbc的支持,涉及到anywhere的odbc驱动。我印象当中,毕业设计导师给我们看的榜样是学姐的pb作品,还记着安装和配置过程非常繁琐,甚至需要在客户目标机上安装pb,而且报错不断。所以,我要做的,就是颠覆它!一定要一键安装,卸载不留垃圾。

其实这个问题,如果目标机上只装一个相关程序是看不出问题的。但是如果像office这种系列软件一样,同时安装多个,就会有问题。所以我势必要搞定它。

摸索过程异常艰辛,暂且不表。只说结果。

1、pb程序的发布,需要LIBJCC.DLL,  PBVM80.DLL(我当时用的pb8)。

2、如果带有anywhere数据库,则需要Deng引擎以及相关dll,大概是:DBCON7.DLL, DBCTRS7.DLL,DBLGEN7.DLL,  DBODBC7.DLL ,  DBODTR7.DLL,   DBOLEDB7.DLL,   DBSERV7.DLL, PBDWE80.DLL ,  PBODB80.DLL等。

3、配置odbc数据源和驱动,实际上就是相关dll和对应注册表键值。打开odbc管理器驱动程序那里,可以找到dll文件名,然后从注册表odbc键值那里去找关联项。主要是:

HKEY_CURRENT_USER\Software\ODBC,HKEY_LOCAL_MACHINE\SOFTWARE\ODBC

在里面仔细找找就知道了。

总之,要知道到底是哪些文件有用,哪些注册表键值有用,那得去挨个试!比如说,想知道ilbjcc.dll和pbvm80.dll有没有键值指向,要搜索注册表去找。因为当时我没有更好的方法,也没有这么发达的网络平台。

一开始发布的时候,安装过程很容易,每个程序都带一份必要的文件即可。但是卸载就出问题了。按照安装顺序的逆序卸载自然没问题,wiseinstaller程序它会自动回滚事务,但是卸载顺序一旦随意,就可能出现有些文件正在被使用,无法卸载,于是就产生垃圾。或者卸载的时候选择删除所有键值和文件,可能导致其它用到共享库的程序无法使用。这个问题要解决就必须知道原理。先看个图。

 其实对于需要注册的dll,键值是同一个,而这个键值只能同一时刻指向一个dll文件,所以这原本就是冲突。每次安装的时候,后安装的程序会覆盖前面的。如果按照安装逆序卸载,它逐个回滚自然没有问题。如果不按顺序卸载,卸载程序为了保证依赖它的程序能正常运行,是能保留正在使用的dll文件和键值,于是产生垃圾。如果选择强行卸载,自然会影响其它程序的运行。

所以我最终发现,按照windows常用的方式,把这些dll都发布到system32目录,就没有问题了。这里要说明,当安装pb环境的时候,在pb安装目录下有个share目录存放这些共享文件。在目标机上,我认为不应该安装开发环境。所以我的做法是,一律随odbc驱动发布到system32目录。

因为共享文件都发布在system32目录,注册表键值也只指向同一位置。所以,无论安装顺序如何, 所谓覆盖前面的安装也无所谓,它还是同一个键值同一个位置,自动判断不覆盖也无所谓。卸载的时候,就选择自动判断依赖。只要共享键值和文件被依赖就不卸载,反之到最后一个依赖程序卸载时,它会一并删除,不留垃圾。

所以这问题就解决了。共享文件不会在目标机上存在多余的副本,安装卸载过程顺畅,不会制造垃圾和其它软件错误。更有趣的是,打包程序体积也变小了,但是为什么会变小我不知道,按理说安装包里的内容没有少。但确实变小很多。

对于odbc,无论是数据源还是驱动,使用这个方法都可以做到完美。我在目标机上自动配置好anywhere驱动后,使用odbc管理器编辑数据源,没有问题。

于是,老师给我们学姐的榜样范例中的各种问题,都迎刃而解。这正是我想要的“完美主义”效果。

所以,现在看起来很一般的问题,要善于理清思路,充分理解操作系统特性是很有必要的。如今网络这么发达,多看资料,多交流,学习效率可以高很多。

本文完。

本文标签: 目录程序wiseinstallerPowerBuilderWindows