pb 调用dll时关于指针参数处理

本文介绍了在PowerBuilder中调用DLL时如何处理指针参数,特别是涉及字符串和复杂类型的情况。通过使用`ref`关键字,确保简单类型以地址方式传递,而复杂类型则直接传递真实地址。同时,文章还展示了如何获取PowerBuilder字符串变量的地址,以及在内存堆上分配空间并存储变量内容的方法,涉及到LocalAlloc、LocalFree和CopyMemory等API函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

声明dll调用时如果有参数是 指针类型时   定义时需要在相应类型前面加上ref 表示传递的地址而不内容

 

ref +简单类型 

复杂类型 会自动将其地址复制一份进行传递

 

对简单类型参数是否被ref修饰的区别在于:被修饰了的参数将以地址方式传值;未被修饰的参数将以拷贝方式传值。

对复杂类型参数是否被ref修饰的区别是相似的。由于复杂类型参数都以地址方式传值,因而不被修饰时参数传递的是拷贝的地址;被修饰时参数传递的是真实地址。

下表说明了参数类型和ref 的关系。

 简单类型复杂类型
    加ref地址真实地址
    不加ref拷贝拷贝的地址

值得注意的是:结构的成员变量如果是复杂类型的话,虽不能在结构声明中加ref,但它们将以真实地址方式传值。此外,结构本身也是复杂类型。因此对结构变量的操作要小心,防止无意中的更改。

 

 

  2、得到pb中某个字符串变量的地址   

 

  这次,单纯依靠pb自身是行不通了,需要请来Win   Api函数帮忙了:   

 

  主人公:Function   long   lstrcpy(ref   string   Destination,   ref   string   Source)   library   "kernel32.dll"   

 

  原型:   

 

  The   lstrcpy   function   copies   a   string   to   a   buffer.     

  LPTSTR   lstrcpy(   

          LPTSTR   lpString1,   //   address   of   buffer     

          LPCTSTR   lpString2     //   address   of   string   to   copy     

        );     

  Return   Values:If   the   function   succeeds,   the   return   value   is   a   pointer   to   the   buffer.   

 

 

  看我怎么大显身手:   

 

  定义实例变量:String   is_dst   

 

      string   ls_src   

      long   ll_address   

      ls_src=   "test   me"   

      ls_dst   =space(255)         

      ll_address=lstrcpy(ls_dst,ls_src)   //将ls_src的内容复制到ls_dst,并返回ls_dst的存储地址   

 

  麻烦是麻烦点,不过终于知道你藏身在ll_address那里了。   

 

  3、在内存堆上分配空间,并存储变量内容   

 

  这里需要LocalAlloc,LocalFree,CopyMemory三个Api函数,其中LocalAlloc,LocalFree用来申请、释放内存块,CopyMemory用来复制内存块。   

  这里着重说明一下CopyMemory函数,有三个参数           

 

  PVOID   Destination,   //   address   of   move   destination     

  CONST   VOID   *Source,   //   address   of   block   to   move     

  DWORD   Length     //   size,   in   bytes,   of   block   to   move       

 

  前两个参数均是指针类型,因此我们可以根据需要在声明中将其定义为long或者ref   ***的形式,反正都是指变量的地址,根据需要定义喽!   

 

  例:   

 

  现在某个Api用到的某个结构中有一个long成员,用来存储另外一个结构Menuitemdata的地址,以备将来所需。   

 

  结构menuitemdata   如下:   

 

  type   menuitemdata   from   structure   

                    unsignedlong     hmenu   

                    integer     level   

  end   type   

 

  好了,看看怎么解决这个问题的。   

 

  相关外部函数声明:   

 

  Function   long   LocalAlloc(long   Flags,   long   Bytes)   library   "kernel32.dll"   

  Function   long   LocalFree(long   MemHandle)   library   "kernel32.dll"   

  SUBROUTINE   CopyMemory(long   pDesc,   ref   menuitemdata   pSrc,ulong   size)   LIBRARY   "kernel32"   ALIAS   FOR   "RtlMoveMemory"     

  SUBROUTINE   CopyMemory(ref   menuitemdata   pDesc,   long   pSrc,ulong   size)   LIBRARY   "kernel32"   ALIAS   FOR   "RtlMoveMemory"   

 

  实例变量:long   il_menuDataPointer     

                      menuitemdata   lpmenuitemdata     

 

  //下面代码将lpmenuitemdata   的内容复制到内存块il_menuDataPointer中     

  lpmenuitemdata.hmenu   =   12345   

  lpmenuitemdata.level   =   1   

  il_menuDataPointer=   LocalAlloc(0,6)   //6=sizeof(menuitemdata)   

  CopyMemory(il_menuDataPointer,lpmenuitemdata,6)   

 

  //那么,如果再从内存块中取出来呢??   

  CopyMemory(lpmenuitemdata,il_menuDataPointer,6)//很简单吧!   

 

  //现在,我不需要   il_menuDataPointer这块内存了   

  LocalFree(il_menuDataPointer)   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值