您当前的位置:首页>论文资料>PowerBuilder外部函数与DLL访问研究

PowerBuilder外部函数与DLL访问研究

资料类别:论文资料

文档格式:PDF电子版

文件大小:112.4 KB

资料语言:中文

更新时间:2024-11-29 17:13:35



推荐标签:

内容简介

PowerBuilder外部函数与DLL访问研究 应用研究
PowerBuilder外部函数与DLL访问研究
邢小平杨玮清
(国防信息学院湖北武汉430010)
数事执术 sam
摘要:PowerBuilder外部函数是指非PowerScript语言构造的函数,这业函数存储予系统的动态键接库中,可通过API函数声明进行程序调用,从而实现某些特殊效果,它们是PowerBuilder内部品数的补充和扩充。本文主要研究论速PowerBuilder外部函数的类型、与DLL之间的参数传递方式以及使用DLL的基本规则等问题。
关键调:PowerBuilderAPI函数动态链接床
中图分类号:TP319
文献标识码:A
1、外部函数的类型与局部函数访间级别
文章编号:1007-9416(2011)11-0046-01
息的Windows环境)以及功能更强的调试工具(如,Soft-ice、 CodeView)进行调试观察。
在PowerBuilder中可以定义两种类型的外部函数,即全局外部函数与局部外部函数。全局外部函数是指在应用程序中的任何位置均可以调用的函数,局部外部函数是指只能在特定的窗口、莱单,用户对象中调用的函数。
若外部函数无返回值或者返回值为VOID,则需要用SUB-ROUTINE关键字代替FUNCTION关键字。另外,若DLL中的名字不是在程序中引用的名字或数据库中的函数名,则在PowerSrcipt 中不合法,领指定ALIASFOR来建立PowerSrcipt名字与外部名字之间的联系。
当定义局部函数时,需指定函数的访间级别,即限定哪些程序可以访问该函数。局部外函数可使用的访问级别有三种,分别为 Public,Private和Protected。其中,Public函数所有应用程序可以引用;Private函数的引用范围仅限于本对象,对象的子类对象不可引
用,Protected函数可在定义对象及其子类对象中引用。 2、PowerBuilder与DLL之间的参数传递
外部函数的参数引用领符合Pasca1规则,在缺省情况下, PowerBuilder是通过"值传递"的形式来完成与DLL间的数据传递,即PowerBuilder将对需传递的参数备份一份拷贝,然后通过堆栈将这份拷贝传递给被调用函数。如果我们希望DLL中的函数可以改变调用参数的"原值”,则可通过修改传递法则来实现,即在参数类型
前面加关键字“REF"进行参数声明。 3、使用DLL的基本规则
在Windows中,DLL被装人内存后只存在一个系统实例,操作系统不会因为多个程序使用同一个DLL而在内存中产生多个DLI 副本。每个DLL只有一个最大为64K的数据段,在歇认情况下,
使用了REF关键字,则操作系统将传32位的地址指针(即段地址+ 偏移量,而不是只传偏移量)给PowerBuilder调用函数,从而确保存 DLL函数能够正确找到PowerBuilder对应的数据地址。
事实上,PowerBuilder所使用的数据类型与C语言的数据类型并不完全相同,因此,对于C语盲中不支持的数据类型应在调用函数前进行格式的转换,具体见参考文献[1]。另外,Windows中某些数据类型C语言也不支持,这种情况需要在C预编译时用TYPEDEF 作预定义,而PowerBuilder调用其函数时也要作适当的格式转换。
保护模式下函数调用 4
PowerBuilder程序若访间不属于当前应用程序的内存,可能会导致DLL保护模式出错。此时,需重点检查以下三个方面的间题:
(1)是否向DLL函数传递了错误格式的参数。这种调用方式出错概率较大,又由于PowerBuilder调试器不能跟踪到C语言程序中,因此这种的错误很难发现。如果怀疑参数格式错误,可以在C语言中使用MessageBox函数显示调用参数的方法来检查参数的传递是否正确,更全面的方法是使用Windows的调试服本(带有调试信
方方数据
(2)是否在C语言中引用了超出PowerBuilder范围的数组申请。由于C语言并不检测数组的范围,这也是导致DLL发生保护模式错误发生的常见原因。
(3)是否使用了已释放了的内存指针。为了避免出现这种错误,好的做法是在程序中把已经释放了的内存指针设置为NULL,便于程序在再次使用时的分析判断。
5、关于远指针和静态变量的使用
在C语言中,所有的静态变量和全局变量都是在程序的数据堆中分配的,而其它变量是在栈中分配的。由于DLL只有数据段,而没有自已的堆栈段,因此在使用时它调用程序的难栈。这就意味着寄存DS指向的是DLL效据段,SS指向PowerBuilder应用程序的堆栈。-般而言,普通WindoWs应用程序由于DS和SS相同,允许使用近指针,但如果PowerBuilder程序调用DLL中的远堆变量,则在编程时必须使用32位的远指针,否则程序会出错。因此,如果PowerBuilder 调用与内存导址有关的C函数,在没有把握的情况下应使用C语言中的FAR版本。
另外需要注意的是,不管有多少实例调用同一个DLL,实际上在内存中只有--份DLL代码,实际上,WindoWws是面间多任务的操作系统环境,除了PowerBuilder应用程序用,其它程序也有可能调用的该DLL的实例,因此,就需要充分考虑DLL中的静态变量被修改的间题。
使用外部函数应注意的地方 6
(1)不要共享文件句柄。这是因为每个应用程序都有各自的文件句柄表,如果两个应用程序通过一个DLL来访间同一个文件,它们势必会分别打开这个文件,因此,不能在Windows环境中共享文件旬柄。
(2)及时释故已使用过的资源。这是个比较容易忽略的问题,特别是在GDI环境中使用DLL函数,一定要及时释放它们,否则可能会由于申请GDI资源失败而导致Windows死机.例如,在程序申创建并实例化一个OFFICE对象(VBA对象),在使用完后,应用 DeleteObject函数来删除它。
(3)配置正确的库搜索路径。在程序中,外部函数一旦被声明和引用,就必定会搜索DLL的安装路径,缺省路径是应用程序的当前目录,也可以把DLL安装到Windows目录和Windows>System32目
录中。参考文献
[1]邢小平,谢国珍.PB调用API函数创析[J].电脑学习,2010,2:87-88.
[2]马贵安.PowerBuilderWin32API函数调用参考手册[M].北京:清华大学出版社,2007
[3]晓通数据库研究与发展中心.PowerScript程序设计指南[M],
上一章:PLM系统在产品档案管理中的应用 下一章:ROAM实时地形渲染算法研究

相关文章

基于外部数据的组合机床通用部件设计与研究 PowerBuilder多管道数据拷贝的编程设计 电力信息系统动态访问控制研究 中西方传统建筑外部空间构成比较研究 外部性视角下的产业和谐发展研究 基于外部接驳的城市轨道交通车站站点分类研究 气动充放气系统外部结露机理及试验研究 外部硫酸盐侵蚀作用后混凝土的侵蚀特征研究