摘要:本文主要讨论基于Windows平台的PowerBuilder 8.0应用程序编译发布关键问题和解决方法,包括执行文件的建立、资源文件的创建、安装程序的建立及添加数据源和SQL anywhere 数据库移动处理等问题。关键字:软件开发、PowerBuilder 8.0、应用程序发布、Setup程序制作 。
引言
PowerBuilder+ODBC+SQL anywhere是目前开发数据库应用程序非常流行的模式。但PowerBuilder本身仅是一个开发工具,当一个应用程序被开发并完成调试后,我们还需对其建立可执行文件并移植到终端用户的机器上,其中ODBC的配置和SQL anywhere的安装是难点,本文论述基于Windows平台的PowerBuilder 8.0应用程序编译发布关键技术问题和解决办法。
执行文件的建立
1、编译格式的选择
PowerBuilder 8.0对生成可执行文件提供了两种编译格式:伪代码(Pcode,即pseudocode的缩写)和机器代码(Machinecode)。伪代码是一种在所有PowerBuilder 平台上支持的解释性语言,它的格式与PowerBuilder 运行库(.pbl)一样,在可执行状态下保存单个对象,其优点是方便和可移植;机器代码则是真正的完全脱离PowerBuilder 环境的可执行文件,其优点是速度快,但文件容量比较大。选择编译代码格式一般基于以下三个方面:
①速度。若目标是优化运行速度和应用强化脚本处理,则选择机器代码。要是代码中较多地使用了循环结构、浮点运算或整数算法及函数调用,机器代码将比伪代码做得更好。但伪代码的编译速度比机器代码快,特别是开发人员要快速地创建测试用的可执行文件时非常便利;
②大小。伪代码生成的文件比机器代码的小。如运行应用程序的终端机器容量紧张的话,就需要放弃较快的机器代码而选择伪代码;
③移植。伪代码对于跨平台的应用非常有用。它可以方便地跨平台(PowerBuilder 支持)使用,包括:Microsoft Windows (16位和32位)、AppleMacintosh和UNIX。机器代码是依赖于平台的,也就是说要求生成和可执行应用平台一致,不过它可以获得更好的性能。
2、动态库的建立
发布PowerBuilder 8.0应用可以将一些对象不放到可执行文件中,而放到动态库中在运行时装入,这样可以将应用程序分割成更小的模块便于管理和维护。
选择伪代码(Pcode)编译方式生成PowerBuilder动态库(.pbd文件),选择机器代码(Machinecode)方式在Windows和UNIX平台上生成动态链接库(.dll文件,如将test.pbl编译成test.dll),在machine平台上生成平台支持的共享库(如test.lib)。如果在Windows上有两个应用,那么编译成的.pbd包含一个调用全局外部函数的用户对象,为了保证正确调用函数必须为每个应用单独编译和发布.pbd文件。
当建立动态库时,将源库(.pbl文件)中所有对象的编译版本拷贝到动态库中。为了在某些库中只使用所需的对象,可以将它们放到一个标准的PowerBuilder库(.pbl)中。
在建立动态库时,PowerBuilder并不检查所有对象,只是简单地去掉对象的源格式,因此,对于一些在画笔或脚本中指定了使用资源(图形、图标或指针)的对象,若不想提供单独的资源,则必须在资源文件(.pbr)中罗列出这些资源,这样才能保证在建立动态库时包含这些资源。
动态库的建立有两种途径:一是在库管理画笔中建立;二是在工程画笔中建立工程对象时一起建立。
3、资源文件的使用
可执行文件或动态库中可以包含一些资源(图形、图标或指针),也可以将它们作为单独的资源文件(.pbr文件)保存。
(1)单独的分布资源
若某资源不包含在可执行文件或动态库中,则在执行应用程序引用它时,PowerBuilder按查询路径查找该资源,因此,必须将它与应用程序一起放在查询路径下。
Windows的查询路径为:当前目录,Windows目录,Windows的System目录和PATH环境变量中设置的所有目录。
(2)资源文件
可以使用PowerBuilder资源文件(.pbr)替代单独的资源,其中列出所有的动态分配的资源也可以包含动态分配的数据窗口对象。PowerBuilder将这些资源编译后放入可执行文件或.pbd文件中,这些资源在执行时可直接使用。
若给数据窗口控件动态分配数据窗口对象,则必须创建一个资源文件,且在可执行文件或动态库文件中包含该对象,或在一个单独的动态库中包含它。
资源文件(.pbr)是一个ASCII码文件,在其中列出了应用程序要有到的各种资源(如.bmp、.cur、.ico、.rle和.wmf文件)和数据窗口对象。使用文本编辑器(如Windows的记事本)创建一个文本文件,其中列出在应用中动态引用的资源文件,一行列出一个资源,格式如:
appico.ico
appbmp1.bmp
appbmp2.bmp
……
以上文件和对象都假设是在当前目录中,如果存在于另一个目录中,则必须包含所在路径,格式如:
e:\myapp\test.jpg。
在.pbr文件中指定的文件名必须与在脚本中引用的资源匹配,若引用时包含路径,则在.pbr文件中也必须包含同一路径,否则因PowerBuilder在执行时只是简单地进行字符串比较而导致无法发现该资源。
若应用程序中包含有动态引用的数据窗口,则在.pbr文件中必须包含数据窗口对象,格式如:
myapp.pbl(dw_infodisplay)
其中:myapp.pbl为应用程序库,dw_infodisplay为数据窗口对象,一般是在当前目录或指定路径。在执行时,若引用资源,PowerBuilder首先检查可执行文件,找不到再在.pbd文件中、文件查询路径的目录中查找。
在工程画笔中建立工程对象时可以为可执行文件或每一个动态库指定它使用的资源文件,也可以在库管理画笔中建立动态库时使用。
配置PowerBuilder 8.0应用程序
一般来说发布一个PowerBuilder 8.0应用程序,除提交应用程序可执行文件(.exe)、应用程序的动态库(.pbd或.dll)外,还应包含如下文件:
1、PowerBuilder 8.0应用程序运行时的支持文件
PowerBuilder 8.0应用程序运行时的支持文件(.dll)应放在与应用程序相同的目录中或放在搜索路径中的目录中。
以上文件可以在C:\Program Files\Sybase\Shared\PowerBuilder取得。
2、数据库接口
所有数据库接口文件及驱动程序(PBTRA80.DLL、PBODB80.DLL和PBODB80.INI)必须放在应用程序目录或系统目录中。
以上文件可以在C:\Program Files\Sybase\Shared\PowerBuilder取得。我们把他们复制到应用程序目录或系统目录中。如果使用专用数据库接口以及activeX,所需复制的文件参考PowerBuilder的OnlineBook。
3、Microsoft ODBC驱动程序和DLLs
DS16GT.DLL,DS32GT.DLL,ODBC32.DLL,ODBC32GT.DLL,ODBCAD32.EXE,ODBCCP32.CPL,_
ODBCCP32.DLL,ODBCCR32.DLL,ODBCINST.CNT,ODBCINST.HLP,ODBCINT.DLL,ODBCTRAC.DLL
以上文件可以在Window的系统目录system32取得,具体路径随操作系统不同而不同。我们把他们复制到应用程序目录或系统目录中。
4、Adaptive Server Anywhere的ODBC数据库驱动程序及其支持文件
PBBAS15.dll,PBFLT15.dll, PBUTL15.dll,PBTRN15.dll,IVPB.LIC,PBDRV15.CNT,PBDRV15.HLP。
以上文件可以在C:\Program Files\Sybase\Shared\MerantODBC取得,我们把他们复制到应用程序目录或系统目录中。
5、Adaptive Server Anywhere运行系统文件
DBODBC7.DLL,DBBACKUP.EXE,DBCON7.DLL,DBISQLC.EXE,DBLGEN7.DLL,DBLIB7.DLL,DBODTR7.DLL,_
DBTOOL7.DLL,DBUNLOAD.EXE,DBVALID.EXE,DBENG7.EXE,DBCTRS7.DLL,DBSERV7.DLL,DBWTSP7.DLL。
以上文件可以在C:\Program Files\Sybase\SQL Anywhere 7\win32取得,我们把他们复制到应用程序目录或系统目录中。
6、OLE系统文件
如果应用程序中使用了OLE控件,那么终端用户的机器上应该有OLE系统文件,它们是:
COMPOBJ.DLL,OLE2NLS.DLL,CTL3DV2.DLL,OLE2PROX.DLL,OLE2.DLL,STORAGE.DLL,OLE2CONV.DLL,_
TYPELIB.DLL,OLE2DISP.DLL,TDOLE.TLB
若它们不存在的话,我们把他们复制到应用程序目录或系统目录中。
以上所列的所有支持文件不一定全部要把他们复制到应用程序目录或系统目录中,具体可根据情况灵活决定。在发布应用程序之前,为确定都需要包含哪些动态链接库,一种比较可行又可靠的方法是:
(1)将生成的应用程序拷贝到另一台未装过PowerBuilder的计算机上并运行它。
(2)找出应用程序提示的因找不到而不能运行的那个动态库。
(3)从开发该应用程序的机器上将相应的动态库文件拷贝过来。
(4)重复(2)(3)两步,直到所有动态链接库都包含进来。
安装程序的制作
在Windows平台上开发的应用程序不能象在DOS环境下经过简单的COPY就可发布和安装。因此,制作一个安装程序(Setup)就成为Windows平合应用程序发布的必不可少的重要一步。
1、Setup的基本功能
Setup程序的唯一目的就是安装应用程序,应该由它来完成对安装过程的处理,Setup程序应具备以下基本功能:
(1)传送文件。将需要安装的应用程序及有关的支持文件传送到目标机器上,并处理传送过程中的错误。此乃Setup程序最基本的功能。
(2)询问终端用户有关必要的信息,如用户名、产品序列号、目标路径等,并响应用户输入。
(3)给用户以改变想法的机会,如改变安装路径、取消安装等。
(4)注册表访问。如设置应用程序查找路径键、创建应用程序信息键等。
(5)卸载功能,对安装的文件及对注册表的设置应有卸载登记功能,以便用户在取消安装或在不需要时顺利卸载应用程序并改回注册表。
(6)安装完毕应给用户以完成提示。
2、应用程序的安装规则
当把应用程序安装到机器上时,有许多规则应当遵从,其中大多数是常识性的。它们使用户的应用程序维护更加容易,而且较少产生由文件复制而引起的问题。
(l)应避免把任何文件拷贝到系统目录中,除非正在升级由外部的应用程序使用的常用文件(例如,ODBC或本机数据库驱动程序)。这有助于避免由于改变了这些区域的文件而使操作系统的性能降级。
(2)如果文件是一个仅在单个用户的应用程序之间共享的通用文件,就应在Program Files的子目录Common Files中建立一个入口。
(3)在 Windows中,应把用户自己的应用程序放在Program Flies下自己的目录中。
(4) 对于 Windows应把支持文件( .hlp、.dll等)分布在称为System用户自己的应用程序的一个子目录中。然后将它的位置注册在应用程序的HKEY_LOCALMACHINE\software入口处的AppPathS子键的注册表中。
(5)应使用注册表存储有关应用程序的所有必需信息,而不应该修改system.ini、win.ini或应用程序的INI文件。
(6)在操作系统的启动引擎中制作一个入口,提供对用户应用程序的访问。对于Windows,应把应用程序的一个快捷图标放在桌面或在开始菜单的程序文件夹中。
(7)用户放在系统目录中的任何文件都应注册于HKEY_LOCALMACHINE的sharedll子键中。
3、安装程序制作工具的选择
Installshield是InstallShield软件公司开发的著名的安装程序制作软件。Installshield提供了易于使用的向导和一个集成环境来帮助创建应用程序安装程序。但是InstallShield的使用比较复杂,InstallShield并不是自由软件,而是一个有版权的商业化软件。绝大部分PowerBuilder 8.0书籍资料在谈及发布应用程序时极其简单地提示使用InstallShield制作安装程序。而介绍InstallShield使用的资料又非常少。因而常会碰到不少困难。
在制作中安装程序时比较常用的安装制作工具是CreateInstall 2000。它是一个共享软件,支持中文。能在www.Gentee.com下载到。没有注册的话会在制作好的安装盘运行时出现提示信息,但是功能是没有限制的。
另一个比InstallShield更加方便好用的安装制作工具是GP-Install。GP-Install是一个用Delphi编制的自由软件。虽然是自由软件,但不是说它的功能就比较少,或者不够强。正好相反,一个安装软件应该有的功能它一个不少,而且相当方便、实用。整个软件安装以后大约有2M,只是InstallShield的零头。InstallShield有的功能GP-Install基本都有,生成的安装程序界面也非常相似,但GP-Install更加让人感到亲切。GP-Install还有一个最大的特点就是允许生成带有多国语言的安装程序,在一个安装程序中就包含了多种国家的语言,并且你在安装时选择了什么语言,在反安装(卸载)时也会显示出什么语言。这对于希望把自己的程序向其他国家、地区推广的程序员来说是非常有用处的。GP-Install主页:http://www.qsc.co.uk,你可以在那里下载一个最新的版本,目前最新版本是5.0.2.57。
其它还有一些比较常用的可用来制作安装程序的软件有Setup Factory 等。
4、添加注册表信息
这是最关键的!涉及到ODBC的安装和数据源的配置。千万不能搞错,否则前功尽弃。
添加注册表信息的方法有两种:
(1) 直接添加,主要见于手工添加数据源或创建安装程序时。一般只须对下列项进行设置即可:
根键
子键
值名称
值
HKEY_CURRENT_USER
Software\ODBC\ODBC.INI\demo(替换成你自己的数据源名称)
AutoStop
Yes
HKEY_CURRENT_USER
同上
DatabaseName
Demo(替换成你自己的数据库名称)
HKEY_CURRENT_USER
同上
DatabaseFile
demo.db(替换成你自己的数据库文件)
HKEY_CURRENT_USER
同上
Driver
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll
HKEY_CURRENT_USER
同上
PWD
Sql
HKEY_CURRENT_USER
同上
UID
Dba
有时还须对下列项进行设置:
根键
子键
值名称
值
HKEY_CURRENT_USER
Software\ODBC\ODBC.INI\demo(替换成你自己的数据源名称)
Description
我的数据库(替换成你对自己数据库的描述,可以是中文)
HKEY_CURRENT_USER
同上
EngineName
我的数据库(替换成自己的数据引擎描述,可以是中文)
HKEY_CURRENT_USER
同上
Start
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbeng7.exe -c 8m,0
HKEY_LOCAL_MACHINE
software\ODBC\ODBC Drivers
Adaptive Server Anywhere 7.0
Installed
HKEY_LOCAL_MACHINE
software\ODBC\Adaptive Server Anywhere 7.0
Driver
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll
HKEY_LOCAL_MACHINE
software\ODBC\Adaptive Server Anywhere 7.0
Setup
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll
HKEY_CURRENT_USER
software\ODBC\ODBC.INI\ODBC Data Sources
你自己的数据源名称如:demo
Adaptive Server Anywhere 7.0
HKEY_LOCAL_MACHINE
software\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe(替换成自己的可执行文件名)
Path
C:\Program Files\sybase\shared\PowerBuilder;
c:\program files\sybase\SQL Anywhere 7\win32\;C:\Program Files\Sybase\Shared\MerantODBC
HKEY_LOCAL_MACHINE
software\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe(替换成自己的可执行文?
Default
MyApp.exe(替换成自己的可执行文件名)
以上各项为注册可执行文件和搜索路径。你也可以改变为另外的路径。具体情况在制作安装程序时灵活决定。
(2) 在PowerBuilder中用程序来动态添加ODBC数据源,主要是利用 PowerBuilder对注册表操作函数 RegistrySet(),再就是利用 PowerBuilder的ProfileString()函数和SetProfileString()函数读取和设置INI配置文件中预先定义好的参数。
RegistrySet( Key,Valuename,Valuetype,Value)
功能:在PowerBuilder程序中设置注册表中的信息。
Key表示主键; Valuename表示键值名; Valuetype表示键值类型;Value表示键值。
Profilestring(Filename,Section,Key,Value)
功能:在PowerBuilde程序中读取INI配置文件中的信息。
Filename表示文件名;Section表示段名;Key表示关键字;Value表示关键字值。
SetProfileString(Filename,Section,Key,Value)
功能:在PowerBuilde程序中设置INI配置文件中的信息。
Filename表示文件名;Section表示段名;Key表示关键字;Value表示关键字值。
至此,ODBC和数据源就配置好了。 对不同的数据库管理系统而言,上面的方法和语句会有所不同,但用户可用以下方法作为用程序添加ODBC数据源的依据:①在控制面板中打开ODBC数据源管理器,手动添加一数据源。②运行Regedit,打开注册表编辑器,找到刚才添加的数据源,记下其各键值的值。③在安装程序中或在PowerBuilder程序中用 RegistSet()函数把各键值的值写入注册表。当然,某些键值肯定会不同,比如数据库的具体路径等。
5、数据库文件(.db)的移动处理
在PowerBuilder 8.0中,SQL anywhere 数据库由后缀分别为.db和.log两个文件组成,其中.db的文件是用来存放数据库信息(包括表结构、视图、数据等)。而.log文件是个日志文件,用来记录用户每一次对数据库有影响的操作,例如创建或删除表、视图、触发器等对象,插入、删除、修改表中的数据等。当我们建立一个SQL anywhere 数据库时,除生成一个库文件(.db)外,还默认建立相应的.log文件。
移动SQL anywhere 数据库时首先将.db文件和.log文件一同复制,配置ODBC, 再在PowerBuilder中设置Profile即可连通。但日志文件(.log)经常会带来一些麻烦,使数据库不能方便地移动到别的机器上使用。因为如果SQL anywhere在创建数据库的时候把日志文件的路径信息存放到了数据库中,那么你把数据库拷贝到另外一台机子上时,如果目录不一样,则数据库就连不上了。
一般的解决方法是:在终端用户机器上建立一个对应的目录。即如果在建立该库时的.log文件路径为:H:\Pb8.0\share\myapp.log,则在终端用户机器上先建立一个盘号为H:的虚拟盘,再建立相应的目录,将myapp.log拷贝到该目录中(也可不拷,则重新建立.log日志文件),即可打开并调用数据库了。另一种解决办法是:重新注册.log文件,在DOS模式下进入SQL anywhere 的Win32目录, 运行DBLOG -T X1:\PATH1\XXX.LOG X2:\PATH2\XXX.DB。其中X1:\PATH1\XXX.LOG是生成的新.log文件要放的路径和名称。X2:\PATH2\XXX.DB是你现在应用程序要使用的.db文件。注意不要搞错了。
一般情况下,若不是要求太高,可省略掉.log文件,即在建库时不要附带.log文件,这样库文件移动起来也就方便一些。
突然断电或不正常关机或你不小心操作都有可能破坏SQLAnywhere的数据,由此造成很大的损失,如果只损坏了.db文件而.log还正常,则可以恢复被破坏的数据库的的大部分数据,只要把.log文件的内容转换成一条条的SQL语句,然后再建一个空的数据库,再执行这些SQL语句,则恢复数据的问题就解决了。Sybase公司提供了几个实用程序来完成以上功能。
现假设数据库系统文件分别名为myapp.db和myapp.log。如果myapp.db已被破坏。现在创建一个新的数据库,假设文件分别名为new.db和new.log。
用Sybase提供的dbtranw.exe,db32w.exe,rtsqlw.exe等实用程序来完成恢复工作,步骤如下:
1.dbtranw -r-k-y myapp.log db.sql // 把.log文件的内容转换成的SQL语句
2.attrib -r myapp.db // 修改只读文件myapp.db的属性为可写
3.attrib-r myapp.log // 修改只读文件myapp.log的属性为可写
4.copy new.db myapp.db // 用新的空库文件覆盖被破坏的旧库文件
5.copy new.log myapp.log // 用新的日志文件覆盖旧的日志文件
6.db32w.exe -d myapp.db // 启动数据库SQLAnywhere
7.rtsqlw-q-c "userid=dba;password=sql " read db.sql // 执行从.log文件中倒出来的SQL语句
其中第一步的功能是把旧的日志文件转换成SQL语句,并放在一个名为db.sql的文件中,特别注意它只能在第五步之前操作,否则日志文件会被new.log所覆盖,而导致无法恢复数据。最后一步的功能是从文件db.sql中读取SQL语句并执行,假设数据库的用户名为dba,而口令为sql。有关各个命令及参数据的更详细的用法可以查看相应的帮助。注意:.log文件不能随便删除,否则恢复的数据就不完整。
结束语
本文就基于Windows平台的的PowerBuilder 8.0应用程序编译发布的关键问题进行了分析,并给出了详细的解决方法,主要包括开发PowerBuilder 8.0应用程序时,执行文件的建立、资源文件的创建、安装程序的建立及添加数据源和SQL anywhere 数据库移动处理等问题。该方法并不限于Powerbuilder,对其它开发工具同样有借鉴意义。所论技术已在广西师大计算机系研究生综合管理系统MPS开发中得到验证。同时,该技术已应用于多个管理信息系统中,收到了良好的效果。