PB调用DLL的常见问题及处理方法

PowerBuilder PB9.0 调用外部dll问题汇总 PB9.0 外部dll 阅读详情
AI摘要

本文详细介绍了PowerBuilder(PB)调用DLL过程中遇到的各类问题,包括调用约定、DLL依赖、路径搜索、函数声明错误、函数使用错误、DLL开发者错误以及32/64位兼容性问题。针对这些问题,提供了相应的处理方法,如检查调用约定、解决DLL依赖、管理当前目录、正确声明和使用函数、预分配内存以及确保使用正确的DLL版本。此外,还讨论了COM类DLL的挑战,建议避免在PB中使用。最后提醒,PB是32位程序,务必使用32位DLL。

PB调用DLL的常见问题及处理方法

首先,为方便描述,先假设有一个DLL文件,名称为 test.dll,里面有个函数叫test。

第一类:通用型标准DLL

1、调用约定问题。Windows系统的标准DLL,通常有2种调用约定,即__cdecl和__stdcall,__stdcall约定在.h文件中通常又定义为 WINAPI和CALLBACK。咱们的PB只能调用__stdcall约定的DLL,不能调用__cdecl约定的DLL。

如果调用了__cdecl约定的函数,会报以上错误。关键是“specified argument type deffers from ….“,内容是给定的参数顺序与要求的不一样。

对于这两种约定的区别,有兴趣了解更多的,可以自行百度。

2、DLL依赖问题。有时因为test.dll还需要依赖其他DLL,导致调用失败。

依赖的DLL找不到时,通常会报类似这样的错误,然而这个提示并不明确,所以比较难查。在群共享里可以下载 loaddll.exe这个小工具,使用也比较简单,和DLL放在同一个目录,然后进入控制台命令行,输入 loaddll test.dll,观察控制台输出

如果是依赖问题,这里的错误号是126。可以通过百度搜索 “getlasterror 126”查找具体情况,如果是其错误号,搜索时使用其他错误号。

3、DLL路径搜索错误。这个错误通常常是DLL不在应用程序当前目录下造成的,错误截图同上。也许你会说“我肯定我的DLL就在程序目录下“,但请注意是”当前目录“,当前目录并不是只指应用程序目录,虽然初始时默认是应用程序目录。假设你的程序在d:\test目录,你使用 GetOpenFileName 函数选择了d:\document\work.txt,这时候,你的当前目录就是d:\document\,而这时的当前目录下当然找不到 test.dll了,你的test.dll在d:\test呢。这是许多PB程序员容易忽略的原因。解决方法通常有以下几种:

(1)在调用GetOpenFileName GetSaveFileName等函数前,先GetCurrentDirector函数保存当前目录,完成后,再 ChangeDiredtory切换回原当前目录。

(2)假设你的程序在d:\test目录,你可以直接设置系统的PATH环境变量指向这个目录。当然这个给实施人员带来一些小不便。

(3)程序初始化时,使用系统函数BOOL SetEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpValue)把程序所在目录添加到进程环境变量里去,让DLL可以被搜索到。一个更加智能的方案是使用 pbidea 提供的设置函数

可以确保当前目录、当前目录下的子目录,以及指定的其他目录里存放的DLL都可以被 搜索到。

特别值得一提的是,使用oracle数据库时,它的客户端在连接时会改变当前路径。

4、各种函数声明错误。这种错误就比较复杂了,涉及面也比较广。

可以参考另一篇博客PowerBuilder中调用DLL参数类型_lxbin2003的博客-优快云博客_powerbuilder调用dll,提升对DLL及函数的理解 ,从而正确声明和使用函数 。

特别注意,一般情况下声明函数时 library “test.dll”,而不是 system library “test.dll”,这里的”system”不是随便加的。只有按照PB特定写法的DLL才可以添加这个system关键字。如果对C/C++写PB可调用的DLL有兴趣的话,可以到群共享下载 ,看看 system library方式是如何实现的。

5、函数使用错误。DLL函数都是按照C约定开放接口。我们知道C的指针,总是让人不得不打起十二分精神来对待。你认为PB里不涉及到指针,你就错了。比如test函数

function int test(string a1,ref string a2,long a3) library "test.dll"

这个函数的C原型是这样的:

extern "C" __declspec(dllexport) int __stdcall test(char* a1, char* a2, int a3)

PB里的string,对应到C的原因,实际上就是指针。如果是输入型参数倒也没太大问题,如果是输出型参数,那就必须要预分配足够的内存空间。通常PB里预分配空间,使用space函数。

String ls_a2

ls_a2 = space(10000)

这样 ls_a2 这个变量就有 10000个字符的空间,注意,如果 是PB10以上版本,它实际上有了20000个字符的空间,因为一个 unicode字符占用2个char空间。

如果没预分配内存,或者预分配内存大小不够,程序也许能运行一小会,但后面不知道会在什么位置莫名其妙崩溃。

6、DLL开发者错误。许多人临时需要某个功能,操起VC就开始写DLL,但也因为对c/c++掌握程度问题,会导致一些BUG,这些只能PB运行不正常时,自己排查规律,如果确定是DLL的原因,得找DLL开发人员处理了。

7、一个容易忽视的问题。PB是32位程序,与你运行的操作系统是不是64位没有关系。所以,如果人家提供给你的DLL里有32位和64位,请一定要记住:你使用它的32位DLL,这与你的操作系统无关。

第二类:COM类DLL

曾经COM是非常热门的一个技术,它也是微软应用与操作系统捆绑的一个典范。然而,在PB中,其实并不建议使用COM方式的DLL。

目前COM方式的DLL,一个是历史遗留下来的古老应用,二是有些人图方便使用C#写DLL给PB用,三是有些PB版本(比如PB9)自己也支持写COM给其他应用使用。

COM方式的DLL,它首先需要注册,这个比较麻烦,在win7及以前版本中,还可以使用 run 方式进行自注册,但在WIN10及其后版本中,自注册就比较困难了,因为注册时需要管理员权限。一两台电脑注册COM可以接受,如果类似HIS这样的应用,一个医院动辄布署几百台电脑,需要一个一个去注册COM,那就呵呵了。尤其是C#写的COM,在不同操作系统上,可能依赖的.net framework还不一样,还需要安装这些额外的内容。

所以,建议PB尽量远离COM类的DLL。

第三类:PB自身的DLL

上面刚才提到PB有些本可以写COM。另外,PB自己的PBL也可以编译成DLL。如果是PB编译出来的DLL库,可以直接当作PBL一样添加到库列表中使用。如果给其他人提供PB的业务接口,这也不失为一个方案。只不过它有个限制:只能是同一个PB版本使用。

欢迎加入pbidea群,共同探讨PB技术。群号:624409252

                                 大自在(QQ:781770213)

                                   2022/5/8

C#中调用PB的DLL 首先要知道这个DLL中提供了那些方法,这些方法是怎么声明的。如下面这两种形式:function ShowRPMenuList (SQLConnPChar:PChar; FBCID:PChar):Integer;function GetRPMenuList(RPTConnString:Pchar;FBCID:Pchar):PChar; 然后就是做一些准备工作了:1、在C#程序主目 阅读详情

相关推荐

pb调用c#编写的dll(实例为画带箭头的线)

本人最近要在pb端做一个小的功能——在界面上任意指定位置画一条带箭头的线。这个时候发现单纯用pb来做无法完成(至少目前我没有找到简便的方法,知道的兄弟可以留言告知下),所以想用c#编写一个类库专门用于画线,同时也学习一下c#类库制作的相关流程,特此记录,以备后期查询使用。 1.c#编写dll类库 新建项目: 建立好项目之后,先添加引用,添加引用的方式自行百度。 设置项目相关...

zh1303300的博客 1850

PB9.0调用C#编译的DLL文件

PB9.0调用C#编译的DLL文件 PowerBuilder9.0是一个比较老的语言,在对接第三方程序的情况下,存在不小的缺陷。为了方便实现跟第三方的接口对接,想了个折中的办法,采用PB调用.NET编译好的dll。 一、DLL文件生成 必须以管理员身份运行vs,否则在最后生成解决方案的时候无法通过。 其次,在新增C#项目的时候.NET框架一定要记得选择3.5,太高了不行,这点很重要。 .NET框架一定要记得选择3.5,这点很重要 在项目中新建个类文件,然后在文件上面,类似下图 [ComVi

qq_30207815的博客 2503

PB编码解码动态库深入解析:BASE64、URL和HEX编码

PB(PowerBuilder)是一款由Sybase公司开发的快速应用程序开发工具,旨在提供一种简单而强大的方法来创建复杂的客户/服务器应用程序。PowerBuilder的起源可以追溯到1991年,随后的几十年中,它经历了多次重要更新和发展。CodeUtil动态库支持多种编码类型,包括但不限于以下几种:Base64编码:用于将二进制数据转换为ASCII字符串,常用于在HTTP环境下传输二进制数据。URL编码:主要用在网络传输中,将不安全的URL字符转换为安全字符。

weixin_42146230的博客 577

PbIdea功能系列之PowerBuilder高级图像处理功能

PbIdea

chenllxx的专栏 2702

大自在的PbIdea(强大PowerBuilder接口扩展库)

这是一个基于JSON及webapi 接口的强大PowerBuilder接口扩展库。支持版本 pb8 - pb2019. 好用的 json for PB ,与 datawindow/datasore 无缝对接,能动态创建 dw/ds实现数据导入,也可以在现有dw/ds上按列匹配导入。 实时导入导出 json,速度快,效率高。 uo_json功能函数主要有4个,即: 1、Parse:将字符串转为JSON对象 2、ToString:将JSON对象转为字符串 3、Set:设置JSON对象或数组值 4、Get:获取JSON对象或数组值 在有多层嵌套的情况下,可以使用级联字符串直接取值。

pbfunc外部函数扩展 2015-05-03

1.以非图片方式在Datawindow中显示QR二维码 2.GBK和UTF-8编码相互转换 3.加密解密,RSA加密解密 4.取汉字拼音首字母 5.文件哈希算法:MD5、SHA1、RIPEMD160、SHA256、Tiger、SHA512、Whirlpool、CRC32 6.字符串哈希算法:MD5、SHA1、RIPEMD160、SHA256、Tiger、SHA512、Whirlpool、CRC32 7.URI编码解码 8.Base64编码解码 9.硬盘序列号 10.http的POST和GET操作

C#调用PB生成dll详解

前言:调用dll时,需要先问清楚dll是由什么语言编译的,要不然方向错了会有很多无用功 试错过程: 直接引用出错:“…不是规范的COM组件” DllImportm方式 [DllImport("yhinterface.dll", EntryPoint = "f_sblwsk", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling ...

qq_40982465的博客 2434

pb图片处理

使用pb 来调整图片的大小等的处理

pb调用c语言dll,PB调用C#编写的Dll类库

在c# 中编写com组件,供PB调用实例前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意。c#中新建类库类库类型为通用类库,项目名为AddCom1、配置:右键点击解决方案资源管理器中的AddCom,选择“属性”,选择“应用程序”->“程序集信息”,勾选“使程序集COM可见”,然后点击“生成”,选择“为COM互操作注册”2、打开Assemb...

weixin_34377666的博客 800

PBIdea(扩展手册)

PBIdea(扩展手册)

dmx512协议c语言编程,DMX512协议+c程序代码.pdf

DMX512 协议1.协议简介DMX 是Digital MultipleX 的缩写 ,意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990 年发布的灯光控制器与灯具设备进行数据传输的工业标准 ,全称是 USITT DMX512(1990) ,包括电气特性、数据协议、数据格式等方面的内容。2. 电气特性和物理层2.1. 电气特...

weixin_39928993的博客 2543

[PB+Delphi]主应用程序用的是PB,操作界面调用Delphi开发的DLL

需求:由于最近接到这样的项目,甲方他们要求我们开发的功能加入他们原先已经存在的一个PB开发的应用程序中。唯一的目的是不想有两个exe应用程序。方案:把Delphi的应用程序用dll的形式打包,然后在PB里调用。设计:        一、 PB部分                 1、新建一个非可视化的类n_cst_demo,我们把同一模块的调用都放到 这个类里。                  

玩的就是Code 2496

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-优快云博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3163

PB调用C#编写的DLL

C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它进一步的发展,这个就不多说了,玩PB的朋友都清楚.PB如何调用C#写的DLL,这个兴趣一上来,就忍不住要解决它.经过多方查找资料加上自己写代码...

测试0901-1 603

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 299

R | 提取文件夹内栅格数据的最小值、最大值、标准差和平均值

各位同学好,我们长需要用长时间序列栅格数据的平均值做变量的时间变化分析,用代码能够帮助我们省下很多时间。

qq_48539301的博客 449

用PB调用VC编制DLL

使用PowerBuilder(PB)开发应用程序时,可调用VC语言编制的动态链接库(DLL)来实现在PB中不容易实现的功能。实践中我们曾使用VC建立DLL,并在PB中调用VC创建的DLL函数,应用效果不错。在此主要介绍动态链接库的基本特点与使用方法。动态链接库简述   动态链接库(Dynamic-Link Library)简称DLL,是基于Windows系统的程序设计中的一个非常重要的组成部分

xunilinux的专栏 873

Python入门之机器学习(非常详细)篇幅拉满,一般人看不完!

什么是机器学习?监督学习 supervised learning;非监督学习 unsupervised learning;半监督学习 semi-supervised learning;强化学习 reinforcement learning;监督学习是不断向计算机提供数据(特征),并告诉计算机对应的值(标签),最后通过大量的数据,让计算机自己学会判断和识别。例如Google Photo,你在APP中输入狗,这时就会弹出与狗相关的图片,这背后使用的算法就是监督学习。

xiaolinyui的博客 2万+

【原创】PB调用SAP的Web Service结构体数组参数方法详解(使用C#调用Web Service生成dll)

最近接口项目需要用PB调用SAP的Web Service,研究了PB的Webservice Proxy很久。     但核心问题来了:SAP的Web Service函数中参数实际传输的是Table,也就是结构体数组参数。测试证明,即使PB12.5都对结构体参数的Web Service支持不完善,就不要说结构体数组了!   肿么办?研究发现,我们可以使用C#调用结构体数组参数的Web Service,然后拆解为单结构体,转换为字符串数组参数,封装为DLL函数,供PB调用。这种方式理论上,应该适用于PB的任何版

nocry115的博客 5058

注意力机制模块:CA(坐标注意力)二次创新:融合深度可分离卷积,打造 CADS 模块

本文提出CADS模块,将坐标注意力(CA)与深度可分离卷积(DSC)深度融合,优化移动端AI部署效率。通过重构CA的计算范式,用深度卷积替代传统1×1卷积,在保持精度的同时显著降低计算开销。文章深入分析了CA的计算瓶颈和DSC的实际效率问题,详细阐述了CADS的设计原理与PyTorch实现,并提供了多组性能对比数据。该模块可直接应用于YOLO、UNet等主流模型,为移动端AI部署提供高效解决方案。

ZXSXJ的博客 96

YOLO11改进:轻量级改进 | 通用倒瓶颈(UIB)搜索块结合C3k2二次创新 | 轻量化之王MobileNetV4

通用倒瓶颈(UIB)搜索块替代YOLO11的C3k2

会AI的学姐 293

用VC创建供PB调用的DLL

1、用vs.net2003新建vc++项目中的“WIN32 项目”,项目名称为wxjextend,应用程序类型选择dll2、在主 DLL 源文件中输入long WXJEXTEND_API __stdcall BitAnd(long bit1, long bit2){ return bit1 & bit2;}long WXJEXTEND_API __stdcall BitOr(long bit1,

HAHA 1752

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

如何用VC编写供PB调用的DLL

和编写一般的DLL方法相同,需要注意以下两点: (1)调用约定 c函数有_stdcall、_cdecl、_fastcall等多种调用约定,调用约定用来说明函数参数的压栈顺序和由谁(函数自身还是调用者)来修改堆栈。关于调用约定的详细说明,请参考我转载的另一篇文章。 编写供PB调用DLL,请使用_stdcall调用约定,如下所示: extern "c" _declspec(DLLex...

alili1991的博客 189

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pb调用dll动态库方法

FUNCTION 返回类型 函数名称(参数类型 参数名称) LIBRARY "动态库名称.dll" ALIAS FOR "函数名;FUNCTION 返回类型 函数名称(参数类型 参数名称) LIBRARY "动态库名称.dll"该函数的功能就是一个a+b后,返回计算结果。1.将动态库文件放置到程序目录下;

智伴文阁的博客 666

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C#调用PB写的com组件dll

背景 小编为了使用C#去模仿PB代码的加密算法,结果发现PB算法中,的long类型只有21亿,实际上传入的数值达到了78亿,造成了数据溢出,精度丢失的情况。 然而PB的算法已经使用C#不可以还原(C#的long类型比PB的long类型大多了)。想到是否可以使用C#去调用PB的加密,经过一番波折终于成功了。 先来一张最终效果图: C# PB: 步骤 首先得PB去生成CO

zero的小纸条 4334
上一篇: cairo显示多行文本
下一篇: PB的扩展DLL开发(超级篇)(五)
lxbin2003
博客等级 码龄19年 343粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值