在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对于快速开发数据库应用方面的确有其独特的优势,但遇到需要用第三方语言来扩展功能的时候,就显得力不从心了。
分享到:
相关推荐
新增自动删除每行代码前面和后面以某个字符串为标记,在此 标记之前和之后的代码语句,类似于 Trim, LeftTrim, RightTrim 5.5 新增 PBDataWindow.exe,处理从 PBL 里选择 DataWindow 自动 生成和结构体、变量,...
新增自动删除每行代码前面和后面以某个字符串为标记,在此 标记之前和之后的代码语句,类似于 Trim, LeftTrim, RightTrim 5.5 新增 PBDataWindow.exe,处理从 PBL 里选择 DataWindow 自动 生成和结构体、变量,...
= 1 表示英文 自动集成PBCOMMENT到PB开发环境,现在支持所有的PB版本(6.0-9.0) 新增自动删除每行代码前面和后面以某个字符串为标记,在此 标记之前和之后的代码语句,类似于 Trim, LeftTrim, RightTrim 5.5 新增 ...
错误修正: <br> a) beta 1 可能会把从 ISO 9660 压缩文件中解压文件的文件名剪裁一个字符; <br> b) 打开“Windows 进度条”选项则在转换压缩文件窗口中进度条不能正确工作; <br> c) 如果 setting.reg 在 %...
2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码) #include using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=...
4.一个数据结构在计算机中(表示) 称为存储结构。【华中理工大学 2000 一、1(1分)】 5.抽象数据类型的定义仅取决于它的一组__(1)_,而与_(2)_无关,即不论其内部结构如何变化,只要它的_(3)_不变,都不...
Agent技术的应用 ---- Microsoft Agent是微软公司于1997年9...ReadReturn //当完成了上面两个动作时候用,可回到标准状态 (接上两个中的一个用) Reading //一直认真地读,连续状态 (可用) Note: This animation...
八、 屏蔽了设计器中打开模板时如果数据库控件连接字符串无效时报错的信息【脚本】 九、 设计器增加了行号显示功能 十、 增加了SetAppConnectionString方法,数据库连接控件增加了AlwaysUseAppConnString等相关属性...
八、 屏蔽了设计器中打开模板时如果数据库控件连接字符串无效时报错的信息【脚本】 九、 设计器增加了行号显示功能 十、 增加了SetAppConnectionString方法,数据库连接控件增加了AlwaysUseAppConnString等相关属性...