pb公共变量怎么找_PB中如何得到一个字符串变量的地址

在PowerBuilder(PB)中调用DLL时,通过REF传递字符串可能会导致问题。本文介绍了一种通过Windows API `lstrcpy` 获取字符串地址的方法,以正确传递给DLL。通过声明并调用`lstrcpy`函数,将字符串复制到临时缓冲区,然后传递缓冲区的地址给DLL,从而解决DLL接收到乱码的问题。
摘要由CSDN通过智能技术生成

在PB中,经常会需要调用一些动态库(DLL)来实现功能的扩展,但DLL一般都是C语言或Delphi语言写的,常常会使用指针,给出的参数也常常是指针形式的。虽然PB中可以加上REF关键字来指明传递的是参数地址,但实际使用中却往往会出一些意想不到的结果,我最近在调用一个DLL时,使用REF传递一个字符串给DLL,但最后DLL取到的却是一串乱码,这说明传给DLL的地址错了,DLL取到了别的内存块的数据,此时,PB只能望针兴叹了。

其实,在有些时候,我们还是可以变通地使用一些其他办法来迂回地操作指针的。下面是我实际使用的通过Windows API来取到字符串地址的方法:

一、首先声明一个API函数:

Function long lstrcpy(ref string Destination, ref string Source) library "kernel32.dll" ALIAS FOR "lstrcpy;ansi";

二、再调用上面的函数来得到字符串地址:

String ls_src, ls_dst

long ll_address

ls_src = "PB中如何得到一个字符串变量的地址"

ls_dst = space(255)

ll_address=lstrcpy(ls_dst, ls_src )

这样,ll_address中得到的就是字符串ls_dst的地址了,我有一个C语言写的DLL,其中一个函数是这样的:

void  __stdcall ChangePrinterSetting(LPTSTR pCustomFormName, SIZEL* FormSize);

按照正常的方式,在PB里应该这样声明并调用:

public FUNCTION Integer ChangePrinterSetting(REF string formName, REF STRU_SIZEL size) LIBRARY "PrnSet.dll" ALIAS FOR "ChangePrinterSetting;ansi";

String ls_fromName

STRU_SIZEL  size;

ls_fromName = "我的表单格式"

size.cx = 100000

size.cy = 200000

ChangePrinterSetting(ls_fromName,  size)

但这样调用,实际运行发现,DLL中取到的是乱码,说明通过REF关键字传递给DLL的参数地址错了,于是我改成这种方式:

public FUNCTION Integer ChangePrinterSetting(long formName, REF STRU_SIZEL size) LIBRARY "PrnSet.dll" ALIAS FOR "ChangePrinterSetting;ansi";

String ls_fromName, ls_temp

STRU_SIZEL  size;

ls_fromName = "我的表单格式"

ls_temp = space(255)

ll_address=lstrcpy(ls_temp, ls_fromName)

size.cx = 100000

size.cy = 200000

ChangePrinterSetting(ll_address,  size)

这样,DLL里就取到了正确的中文字符串。这样多写了几行代码,保存了参数正确传递,也算是没有办法的办法吧。

总得说来,PB对于快速开发数据库应用方面的确有其独特的优势,但遇到需要用第三方语言来扩展功能的时候,就显得力不从心了。

0

0

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-07-28 17:39

浏览 5575

评论

楼主!我现在也遇到与你类似的问题了!但是我无法使用声明之后的lstrcpy函数!请赐教!谢谢

我的操作系统:XP Service Pack 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值