PowerBuilder外部函数和DLL访问研究.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PowerBuilder外部函数和DLL访问研究

PowerBuilder外部函数和DLL访问研究   摘要:PowerBuilder外部函数是指非PowerScript语言构造的函数,这些函数存储于系统的动态链接库中,可通过API函数声明进行程序调用,从而实现某些特殊效果,它们是PowerBuilder内部函数的补充和扩充。本文主要研究论述PowerBuilder外部函数的类型、与DLL之间的参数传递方式以及使用DLL的基本规则等问题。   关键词:PowerBuilder API函数 动态链接库   中图分类号:TP319 文献标识码:A 文章编号:1007-9416(2011)11-0046-01      1、外部函数的类型与局部函数访问级别   在PowerBuilder中可以定义两种类型的外部函数,即全局外部函数与局部外部函数。全局外部函数是指在应用程序中的任何位置均可以调用的函数;局部外部函数是指只能在特定的窗口、菜单、用户对象中调用的函数。   若外部函数无返回值或者返回值为VOID,则需要用SUBROUTINE关键字代替FUNCTION关键字。另外,若DLL中的名字不是在程序中引用的名字或数据库中的函数名,则在PowerSrcipt中不合法,须指定ALIAS FOR来建立PowerSrcipt名字与外部名字之间的联系。   当定义局部函数时,需指定函数的访问级别,即限定哪些程序可以访问该函数。局部外函数可使用的访问级别有三种,分别为Public、Private和Protected。其中,Public函数所有应用程序可以引用;Private函数的引用范围仅限于本对象,对象的子类对象不可引用;Protected函数可在定义对象及其子类对象中引用。   2、PowerBuilder与DLL之间的参数传递   外部函数的参数引用须符合Pascal规则,在缺省情况下,PowerBuilder是通过“值传递”的形式来完成与DLL间的数据传递,即PowerBuilder将对需传递的参数备份一份拷贝,然后通过堆栈将这份拷贝传递给被调用函数。如果我们希望DLL中的函数可以改变调用参数的“原值”,则可通过修改传递法则来实现,即在参数类型前面加关键字 “REF”进行参数声明。   3、使用DLL的基本规则   在Windows中,DLL被装入内存后只存在一个系统实例,操作系统不会因为多个程序使用同一个DLL而在内存中产生多个DLL副本。每个DLL只有一个最大为64K的数据段。在默认情况下,PowerBuilder都是使用“值传递”来传递参数。若在定义外部函数时使用了REF关键字,则操作系统将传32位的地址指针(即段地址+偏移量,而不是只传偏移量)给PowerBuilder调用函数,从而确保存DLL函数能够正确找到PowerBuilder对应的数据地址。   事实上,PowerBuilder 所使用的数据类型与C语言的数据类型并不完全相同,因此,对于C语言中不支持的数据类型应在调用函数前进行格式的转换,具体见参考文献[1]。另外,Windows中某些数据类型C语言也不支持,这种情况需要在C预编译时用TYPEDEF作预定义,而PowerBuilder调用其函数时也要作适当的格式转换。   4、保护模式下函数调用   PowerBuilder程序若访问不属于当前应用程序的内存,可能会导致DLL保护模式出错。此时,需重点检查以下三个方面的问题:   (1)是否向DLL函数传递了错误格式的参数。这种调用方式出错概率较大,又由于PowerBuilder调试器不能跟踪到C语言程序中,因此这种的错误很难发现。如果怀疑参数格式错误,可以在C语言中使用MessageBox函数显示调用参数的方法来检查参数的传递是否正确,更全面的方法是使用Windows的调试版本(带有调试信息的Windows环境)以及功能更强的调试工具(如,Soft-ice、CodeView)进行调试观察。   (2)是否在C语言中引用了超出PowerBuilder范围的数组申请。由于C语言并不检测数组的范围,这也是导致DLL发生保护模式错误发生的常见原因。   (3)是否使用了已释放了的内存指针。为了避免出现这种错误,好的做法是在程序中把已经释放了的内存指针设置为NULL,便于程序在再次使用时的分析判断。   5、关于远指针和静态变量的使用   在C语言中,所有的静态变量和全局变量都是在程序的数据堆中分配的,而其它变量是在栈中分配的。由于DLL只有数据段,而没有自己的堆栈段,因此在使用时它调用程序的堆栈。这就意味着寄存DS指向的是DLL数据段,SS指向PowerBuilder应用程序的堆栈。一般而言,普通Windows应用程序由于DS和SS相同,允许使用近指针,但如果PowerBuilder

文档评论(0)

317960162 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档