pb8.0:PB8.0应用程序编译发布技术研究

  摘要:本文主要讨论基于Windows平台PowerBuilder 8.0应用编译发布关键问题和解决思路方法包括执行文件建立、资源文件创建、安装建立及添加数据源和SQL anywhere 数据库移动处理等问题关键字:软件Software开发、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 环境可执行文件其优点是速度快但文件容量比较大选择编译代码格式般基于以下 3个方面:

  ①速度若目标是优化运行速度和应用强化脚本处理则选择机器代码要是代码中较多地使用了循环结构、浮点运算或整数算法及机器代码将比伪代码做得更好但伪代码编译速度比机器代码快特别是开发人员要快速地创建测试用可执行文件时非常便利;

  ②大小伪代码生成文件比机器代码如运行应用终端机器容量紧张就需要放弃较快机器代码而选择伪代码;

  ③移植伪代码对于跨平台应用非常有用它可以方便地跨平台(PowerBuilder 支持)使用包括:Microsoft Windows (16位和32位)、AppleMacosh和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)中罗列出这些资源这样才能保证在建立动态库时包含这些资源

  动态库建立有两种途径:是在库管理画笔中建立; 2是在工程画笔中建立工程对象时起建立

  3、资源文件使用

  可执行文件或动态库中可以包含些资源(图形、图标或指针)也可以将它们作为单独资源文件(.pbr文件)保存

  (1)单独分布资源

  若某资源不包含在可执行文件或动态库中则在执行应用引用它时PowerBuilder按查询路径查找该资源因此必须将它和应用起放在查询路径下

  Windows查询路径为:当前目录Windows目录Windows目录和PATH环境变量中设置所有目录

  (2)资源文件

  可以使用PowerBuilder资源文件(.pbr)替代单独资源其中列出所有动态分配资源也可以包含动态分配数据窗口对象PowerBuilder将这些资源编译后放入可执行文件或.pbd文件中这些资源在执行时可直接使用

  若给数据窗口Control控件动态分配数据窗口对象则必须创建个资源文件且在可执行文件或动态库文件中包含该对象或在个单独动态库中包含它

  资源文件(.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所需复制文件参考PowerBuilderOnlineBook

  3、Microsoft ODBC驱动和DLLs

  DS16GT.DLLDS32GT.DLLODBC32.DLLODBC32GT.DLLODBCAD32.EXEODBCCP32.CPL_

  ODBCCP32.DLLODBCCR32.DLLODBCINST.CNTODBCINST.HLPODBCINT.DLLODBCTRAC.DLL

  以上文件可以在Window系统目录system32取得具体路径随操作系统区别而区别我们把他们复制到应用目录或系统目录中

  4、Adaptive Server AnywhereODBC数据库驱动及其支持文件

  PBBAS15.dllPBFLT15.dll PBUTL15.dllPBTRN15.dllIVPB.LICPBDRV15.CNTPBDRV15.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系统文件

  如果应用中使用了OLEControl控件那么终端用户机器上应该有OLE系统文件它们是:

  COMPOBJ.DLLOLE2NLS.DLLCTL3DV2.DLLOLE2PROX.DLLOLE2.DLLSTORAGE.DLLOLE2CONV.DLL_

  TYPELIB.DLLOLE2DISP.DLLTDOLE.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等)分布在称为用户自己应用个子目录中然后将它位置注册在应用HKEY_LOCALMACHINE\software入口处AppPathS子键注册表中

  (5)应使用注册表存储有关应用所有必需信息而不应该修改system.ini、win.ini或应用INI文件

  (6)在操作系统启动引擎中制作个入口提供对用户应用访问对于Windows应把应用个快捷图标放在桌面或在开始菜单文件夹中

  (7)用户放在系统目录中任何文件都应注册于HKEY_LOCALMACHINEsharedll子键中

  3、安装制作工具选择

  Installshield是InstallShield软件Software公司开发著名安装制作软件SoftwareInstallshield提供了易于使用向导和个集成环境来帮助创建应用安装但是InstallShield使用比较复杂InstallShield并不是自由软件Software而是个有版权商业化软件Software绝大部分PowerBuilder 8.0书籍资料在谈及发布应用时极其简单地提示使用InstallShield制作安装而介绍InstallShield使用资料又非常少因而常会碰到不少困难

  在制作中安装时比较常用安装制作工具是CreateInstall 2000它是个共享软件Software支持中文能在www.Gentee.com下载到没有注册话会在制作好安装盘运行时出现提示信息但是功能是没有限制

  另个比InstallShield更加方便好用安装制作工具是GP-InstallGP-Install是个用Delphi编制自由软件Software虽然是自由软件Software但不是说它功能就比较少或者不够强正好相反个安装软件Software应该有功能它个不少而且相当方便、实用整个软件Software安装以后大约有2M只是InstallShield零头InstallShield有功能GP-Install基本都有生成安装界面也非常相似但GP-Install更加让人感到亲切GP-Install还有个最大特点就是允许生成带有多国语言安装个安装中就包含了多种国家语言并且你在安装时选择了什么语言在反安装(卸载)时也会显示出什么语言这对于希望把自己向其他国家、地区推广员来说是非常有用处GP-Install主页:http://www.qsc.co.uk你可以在那里下载个最新版本目前最新版本是5.0.2.57

  其它还有些比较常用可用来制作安装软件Software有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()再就是利用 PowerBuilderProfileString()和SetProfileString()读取和设置INI配置文件中预先定义好参数

  RegistrySet( KeyValuenameValuetypeValue)

  功能:在PowerBuilder中设置注册表中信息

  Key表示主键; Valuename表示键值名; Valuetype表示键值类型;Value表示键值

  Profile(FilenameSectionKeyValue)

  功能:在PowerBuilde中读取INI配置文件中信息

  Filename表示文件名;Section表示段名;Key表示关键字;Value表示关键字值

  SetProfileString(FilenameSectionKeyValue)

  功能:在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已被破坏现在创建个新数据库假设文件分别名为.db和.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 .db myapp.db // 用新空库文件覆盖被破坏旧库文件

  5.copy .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文件中特别注意它只能在第 5步的前操作否则日志文件会被.log所覆盖而导致无法恢复数据最后功能是从文件db.sql中读取SQL语句并执行假设数据库用户名为dba而口令为sql有关各个命令及参数据更详细使用方法可以查看相应帮助注意:.log文件不能随便删除否则恢复数据就不完整

  结束语

  本文就基于Windows平台PowerBuilder 8.0应用编译发布关键问题进行了分析并给出了详细解决思路方法主要包括开发PowerBuilder 8.0应用执行文件建立、资源文件创建、安装建立及添加数据源和SQL anywhere 数据库移动处理等问题该思路方法并不限于Powerbuilder对其它开发工具同样有借鉴意义所论技术已在广西师大计算机系研究生综合管理系统MPS开发中得到验证同时该技术已应用于多个管理信息系统中收到了良好效果

Tags:  编译程序 应用程序的编译 pb8.0教程 pb8.0

延伸阅读

最新评论

发表评论