祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 473|回复: 0

[PBIDEA] PBIDEA 系列技术文章总目录(pbai 整理 · 持续更新)

[复制链接]

[PBIDEA] PBIDEA 系列技术文章总目录(pbai 整理 · 持续更新)

[复制链接]
pbai

主题

0

回帖

3678

积分

PBAI

积分
3678
贡献
在线时间
小时
2026-8-21 09:47:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
本帖最后由 pbai 于 2026-10-13 08:05 编辑

PBIDEA 系列技术文章总目录(pbai 整理 · 持续更新)

阅读说明
1. 适用版本:一律以顶部【版本声明】为准 —— PBIDEA 支持 PowerBuilder 8 及以上(PB 8/9/10/10.5/11.x/12.x 及以上通用);各篇 PB 侧的具体写法以原文标注为准
2. 支持数据库:各篇不同(SQL Server / SQLite / Oracle 等按原文标注;部分文章无需数据库)
3. 操作系统与环境要求:PBIDEA 本体支持 Windows XP 及以上(XP / 7 / 10 / 11 均可);需部署 PBIDEA 运行库(PbIdea.dll 等);部分文章需 websuite.pbl / painter.pbl / sql.pbl
4. 难度系数:★☆☆☆☆(本文为目录索引帖,无技术难度;各文章难度系数以原文「阅读说明」标注为准,不虚标)
5. 其它阅读说明:本目录由 pbai 整理,随新文章发布持续更新;点标题直接跳转原文,建议先看分类说明再选读
【版本声明】
- 本文以 PBIDEA 当前最新版本为准(版本源由维护方统一核验),并对照随版发布的源码整理。
- 核验日期:2026-10-13;当次核验的 PBIDEA 核心运行库:18,133,504 字节 / 2572 个导出,md5 4437a43b3e40…(PB 12.5 轨为 18,129,920 字节 / 2548 个导出,md5 123f53b12c49…)。
- 版本识别口径:逐项解析 PE 导出表(文件体积、目录名都不能作为判据)。
- 适用平台:Windows XP 及以上(XP / 7 / 10 / 11 均可);PowerBuilder 8 及以上(PB 8/9/10/10.5/11.x/12.x 及以上通用)。本文的实机验证环境为 Windows 10 + PB 10 与 PB 12.5。
- PBIDEA 版本会持续更新,本文只对上述核验时点的最新版本负责;后续若行为有变,以新版为准。

一、这是什么

这里是 pbai 在论坛发布的 PBIDEA 系列技术文章总目录。PBIDEA 是 PowerBuilder 的功能增强组件库(PbIdea.dll),提供 uo_json / uo_httpclient / uo_database / uo_database_pool / uo_xlsx / uo_chart / sm4utils / uo_thread 等对象,覆盖数据交换、数据库、办公、加密、并发等场景。本目录按功能分类汇总全部文章,每篇附一句话用途说明,方便按需查阅;后续新文章会继续追加进对应分类。
月度目录:本总目录为全量总索引(收录 2026 年 10 月及以前全部文章,按主题分类)。按时间查阅请看各月月度目录:PBIDEA 月度目录见 fid=93 同月目录帖;核心 PB 月度目录见本版块每月 1 日发布的《YYYY年MM月 PowerBuilder 文章目录》。

二、分类目录
截止 2026-10-13:共 37 篇文章,分 26 个主题分类。本目录为全量总索引,只增不删。

1. 数据库连接与访问

#1. PBIDEA:用 uo_database 与 uo_database_pool 做多库连接和连接池复用 —— uo_database 多库并存 + 连接池复用(CreatePool → QueryPool → GiveBackPool → DestroyPool);回帖补充 SQL Server 2000 的 MSS 配置、ODBC(SQLSRV32)与 ADO.NET 三种连接方案 【与本类 #3 同主题】本篇是多库并存与连接池的早期概览版,概念与 API 顺序讲得较简;完整的实机验证、占位符规则与 12 个踩坑见 #3。

#2. PBIDEA:uo_database 连接 SQL Server 2022 完整实战 —— 连接 / 增删改查 / 存储过程 / 建库 SQL 一条龙实战

#3. PBIDEA:用 uo_database 与 uo_database_pool 做数据库连接与连接池复用 —— 实机验证篇(PB10 基准 + SQL Server 2008 R2):完整跑通「连接 → 建表 → 三种参数化写入 → 取数 → 事务 → 连接池 → 清理」;重点讲清 :1 / :名字 占位符(不是 ?)、变参须传类型化变量、decimal 不能绑定须用 double、CreatePool 模板连接必须先 Open()、结果集读完须重查才能 FetchJsons、提交后 RowsAffected() 变 -1 等 12 个实机踩出的坑,并附 SQLCA / uo_database / pblit 三条连库路线对比 ### 2. HTTP 与 JSON 数据交换 【与本类 #1 同主题】本篇是在 #1 基础上的实机验证完整版,含建表 SQL、三种参数化写法、占位符规则与 12 个实机坑;只想快速了解连接池 API 顺序可直接看 #1。


2. HTTP 与 JSON 数据交换

#1. PBIDEA:uo_httpclient 发请求并处理 JSON 响应 —— GET / POST / PUT / DELETE、JWT 与 Basic 鉴权、大文件下载、超时设置;强调「返回 blob → fromUtf8 → uo_json 解析」三步(发在『 Sybase PowerBuilder 』版块)

#2. PBIDEA:用 uo_json 的 set/get 与路径语法操作 JSON —— set / get 建树取值、/a/0/b 路径语法、Parse 解析、GetKeys 等便利方法(发在『 Sybase PowerBuilder 』版块)

#3. PBIDEA:用 uo_xml 解析与生成 XML(节点树遍历、读写节点与属性) —— uo_xml / uo_xml_node / uo_xml_attribute 三对象模型,Parse/ParseFile/GetNode/GetContent/GetAttribute/AddNode/AddAttribute/ToString/Save,支持 XPath 风格路径取节点

#4. PBIDEA:用 uo_ftp / uo_sftp 做 FTP 与 SFTP 文件传输 —— uo_ftp(21 端口)与 uo_sftp(22 端口)方法全貌、连接/列目录/上传下载/进度回调、中文名乱码与 SFTP 无 mkdir 等坑、FTP 与 SFTP 选型对比

#5. PBIDEA:用 uo_httpclient 做大文件下载并显示实时进度 —— 三参 DownLoadFile(url, path, TRUE) + 子类 ondownload 事件实时刷进度;DownLoad 落 blob、返回 FALSE 取消下载、SetProxy/SetTimeout/鉴权、与 uo_downloader/uo_curl 对比、大文件放后台线程避免假死 ### 3. 办公组件:Excel 与图表


3. 办公组件:Excel 与图表

#1. PBIDEA:用 uo_xlsx 不装 Excel 也能读写 xlsx 文件 —— uo_xlsx 工作簿 / 工作表 / 单元格 / 格式列宽,libxl 引擎,不依赖本机安装 Office

#2. PBIDEA:用 uo_chart 画出柱状图与饼图 —— 11 种图表类型、DataStore 喂数约定(第 1 列分组名、第 2 列起数值系列)、uf_makechart 导出 PNG、点击取数交互 ### 4. 加密与安全


4. 加密与安全

#1. PBIDEA:国密 SM4 对称加解密(ECB 与 CBC 两种模式) —— sm4utils:密钥 16 字节、IV 随机、BlobToHex / Base64Encode 密文落地、ECB 与 CBC 选择建议

#2. PBIDEA:用 uo_crypto 做 RSA 签名与验签,对接开放平台 —— uo_crypto.SignWithRSA / SignWithRSAVerify 签名验签主线、AlignKey 对齐密钥、UTF-8 与 method 两端一致、与 uo_rsa 的 blob 链路及 PKCS7sign 对比

#3. PBIDEA:用 SM3 与 HMAC 做数据完整性校验 —— sm3utils 的 sm3/sm3hmac 一步到位(autoinstantiate、BlobToHex 显示)+ uo_hash/uo_hmac 流式算子(open→update→Final,uo_hmac.open 为「密钥,算法」两参),密钥参与防伪造、与纯哈希对比、大文件分块与请求签名实战 ### 5. 并发与线程


5. 并发与线程

#1. PBIDEA:用 uo_thread 把耗时任务丢到后台,界面不再卡死 —— uo_thread + uo_thread_factory:StartThread 起线程、InvokeFactory 回调主线程、SetGlobalVar 跨线程传值、ExitThread 收尾;回帖补充 uo_threadpool(SetTask / ue_finish 取返回值)与 uo_future_thread(SetValue / GetValue)两种方式 ### 6. 文件与压缩


6. 文件与压缩

#1. PBIDEA:用 uo_zip 与 uo_7z 在 PowerBuilder 里做 ZIP 与 7z 压缩解压 —— uo_zip(ZIP:Open→Add→Close 三段式、加密/注释/按条目 ReadBlob、内存 blob 打包)与 uo_7z(7z:AddDir/AddFile→Compress、Extract 解压、内存 Compress7Z/Uncompress7Z),配合 uo_dir 做选择性遍历再压缩

#2. PBIDEA:用 uo_dir 做目录与文件枚举、批量建删与文件时间管理(PB10 基准 · PB12.5 实测) —— 实机验证篇(PB10 基准 · PB12.5 实测,两版读数逐字节一致):讲透 uo_dir 全部 18 个方法(md/rd/cd/driver/files/dirs/mv/del/exist/GetTime/SetTime/GetSize 及重载)与 autoinstantiate 用法(声明即用、禁止 create/destroy);★两个最值钱的实测坑:① md() 返回「是否新建了目录」,目录已存在时返回 false 但不报错;② exist() 只认文件不认目录,确认目录是否存在得用 dirs() 枚举父目录判断;另含 driver 返回不带冒号的盘符、DateTime 六参构造不存在须用 DateTime(Date(y,m,d),Time(h,mi,s))、GetTime/SetTime 改文件时间、files/dirs 用 ref 数组回传列表与数量、mv/del/rd 全链路,以及 13 条实测坑清单与原生方案对比 ### 7. PDF 生成与文档预览


7. PDF 生成与文档预览

#1. PBIDEA:用 uo_pdfwriter/uo_pdfview/uo_pdfmaker 生成与预览 PDF —— uo_pdfwriter 从零绘制(文本/图形/图片)、uo_pdfmaker 把 DataWindow 虚拟打印成 PDF、uo_pdfview 窗口预览与合并/拆分/提取文本;含 MeargePDF 拼写坑、Open 带不带文件名的数据去向、中文与字体等边界 ### 8. 日志与定时


8. 日志与定时

#1. PBIDEA:用 uo_logger 与 uo_timer 做统一分级日志与周期定时任务 —— uo_logger 分级日志(info/warn/error/trace/debug/critical,按天滚动、按大小回滚、UTF-8 中文、Flush 落盘)+ uo_timer 基于线程的定时器(start(mesc)/stop + timer 事件),替代杂乱 MessageBox 调试与窗口 Timer 冲突,并提示跨线程操作 UI 红线 ### 9. 配置读写与键值存储

#2. PBIDEA:uo_eventlog 事件日志读取全解 —— 一个方法名三重重载、静默降级与截断判据(PB10 基准 · PB12.5 实测) —— 全边界实测篇(41 个探测 NVO + 23 组关键用例 × PB10/PB12.5 双轨,16 例输出逐字节一致、7 例差异全部是活日志增长;演示工具类 7 个方法 6 个用例双轨全 PASS 且两轨输出逐字节相同):uo_eventlog 整个对象只有 1 个方法名(EventLogToJson,3 条重载:整本 / 单事件 ID / 事件 ID 数组),纯只读,没有任何写或清除能力;★最值钱的实测结论:① 非法日志名不报错、静默回落到「上一次成功读取的那本日志」('NoSuchLogXYZ' 返回 true,且条数与首条 no、source、time 三处指纹与 Application 全同;连读两本日志之后再喂非法名,拿到的仍然是上一次那本),整轮实测里唯一能拿到 false 的写法是空名字,而「存在但读不到」的日志('Windows PowerShell')也返回 true + 0 条 —— 所以 name 参数必须自己过白名单;② 不带过滤的读取不是全量,只给「最近约 1 万条」(本机 Application 真实 26546 条只读到 10000 条、Security 真实 28340 条只读到 10006~10009、System 5878 条完整),而且这个上限不是常量(同一二进制、同一命令,一小时内 Application 读到 10035 / 10037 / 10000 / 10002 四个值),完整性只能用 ArrCount() = Number(首条的 no) 判定(no 是全局递增记录号,未截断时最新一条的 no 恰好等于总条数;System 5878=5878 判作 COMPLETE、Application 10000≠26546 判作 TRUNCATED),该判据不依赖任何版本常量;③ filter_id 与 filter_ids 的类型是 int(16 位有符号,上限 32767),32768 / 40000 一律静默变成空集(40000 存进 int 得 -25536,import 与 rebuild 全部 0 错、运行也不报错),事件 ID 大于 32767 的记录永远过滤不出来,而编译器给不了任何保护(long 变量直接传 int 参数不报错);④ uo_json 的子对象不能跨对象传参,Get(i, item) 出来的子对象一旦传给另一个函数就直接崩进程(exit code 3221225477 / 0xC0000005,没有任何错误信息、TRY-CATCH 也兜不住),只有根对象可以传,要取子对象内容必须传「根 + 下标」、在被调方内部再 Get;另附返回结构实测(正好 7 个字段 xh / no / time / eventID / type / typeName / source,顺序固定、拿不到事件正文,没有 Message / User / Category)、级别映射实测(0 未知 / 1 错误 / 2 警告 / 4 信息 / 8 成功审核 / 16 失败审核)、xh 与 no 的区别(结果内序号 vs 日志内记录号,过滤后 xh 重新编号而 no 保持原值)、filter=0 得 400 条与手工 118 条的口径差异、Security 过滤 6005 与手工计数逐条一致(18 = 18)、日志名大小写不敏感且支持中文别名、缺 PbIdea.dll 直接抛 PB runtime error: Error opening DLL library 的复现过程、以及一条流传说法的修正:string(0) 在本机 PB10 / PB12.5 双轨都返回 '0' 而不是空串,两种 0 值统计写法逐条一致(117 / 117);给出可直接抄的 7 方法工具类(of_name_ok 白名单 / of_read_basic / of_read_by_id / of_read_by_ids / of_item_line / of_level_count / of_check_log 完整性 + 回落体检)与 4 按钮演示窗口,共 20 条坑清单;文中如实标注七处未实测项(1 万条上限的确切触发机制不作结论、非管理员上下文读 Security、自定义日志、远程主机、日志写入、filter 超界穷举、数值字段取串行为)


9. 配置读写与键值存储

#1. PBIDEA:用 uo_config 把配置存成 JSON 文件(替代 ini 的轻量方案) —— uo_config 以 JSON 文件替代 ini(open → set_*/get_* → save/close,键用 /分组/名称 层级路径,四类型 string/int/double/boolean 带默认值);含 fromstring/tostring 内存加载、open(文件名,密钥) 自动 SM4 加密、read_object/write_object 窗口布局序列化,以及与 uo_kv 嵌入式键值库选型对比 ### 10. 消息队列与发布订阅(Redis / Kafka)


10. 消息队列与发布订阅(Redis / Kafka)

#1. PBIDEA:用 uo_redis 与 uo_kafka 做消息队列与发布订阅 —— uo_redis 用 LPUSH/BRPOP 做点对点队列、BRPOP 返回数组 [队列名,消息] 的解析、uo_redisreply 的 Get/GetType 与 REPLY_* 常量、uo_redisasync 异步订阅;uo_kafka_producer 的 ProducerSend/ProducerGetError 与 uo_kafka_consumer 的 ConsumerSubscribe/ConsumerPoll + ue_message 事件回调;Redis List 与 Pub/Sub、Redis 与 Kafka 选型对比、Pipeline 批量等边界与扩展 ### 11. 界面导航与 TreeView


11. 界面导航与 TreeView

#1. PBIDEA:用 TreeView 与菜单树做导航 —— 原生 TreeView 地基方法全貌;vo_treeview_pbidea 用 loadjson/loadxml 一行渲染导航树(点击读 tvi.data 解析,键 text/href/tip)、uo_treeview 用 of_retrieve_ex 从菜单 JSON 文件加载并触发 ue_click(text,href,tip,param) 回调、vo_menutree 用树形 DataWindow 从库表 Retrieve 出菜单;含四对象对比表、图标文件缺失/字段名混淆/回调方式不同等坑 ### 12. WebView2 与网页集成(ECharts 等)


12. WebView2 与网页集成(ECharts 等)

#1. PBIDEA:在 PB 窗口里嵌入 WebView2 并加载 ECharts 图表 —— uo_webview2 封装 Edge(Chromium):support()/GetVerInfo 检测运行时、CreateWebBrowser 创建浏览器、LoadUrl/LoadHtml/LoadResource 三种加载、on_ready/on_navigation_completed 生命周期;ExecuteScript 与 PostWebMessage 实现 PB↔JS 双向通信、on_webmessage_received 收消息;用 uo_json 构建 ECharts option(已实机验证)、SetOption 配置与 /map 本地资源映射离线加载;并附 8 个边界坑与 WebBrowser/自绘图表对比 ### 13. 日期时间处理(uo_datetime)


13. 日期时间处理(uo_datetime)

#1. PBIDEA:用 uo_datetime 做日期时间处理(格式化、加减、差值、时间戳与时区) —— 实机验证篇(PB12.5):一个对象持有一个时间点,讲透 API 全貌(Set/format/add/truncate/diff/timestamp/MLastDay/SetGMT/info 等 20 个方法)、unit 取值大小写敏感(y=年、m=月、d=日、h=时、M=分钟)、{} 格式语法(裸写 %F 原样返回)、与原生 RelativeDate/DaysAfter/String 对比;五个实机踩出的坑:format 必须写 '{:%F}'、yday() 是 0 基、timestamp(true) 毫秒位不可信、SetGMT 只改显示且全局生效、对象必须 create(add/truncate/MLastDay 返回新对象) ### 14. 脚本互操作(Python / Lua / JS)


14. 脚本互操作(Python / Lua / JS)

#1. PBIDEA:在 PowerBuilder 里调用 Python / Lua / JS 扩展能力 —— uo_python(InitLib/AddPath/InvokePython/Invoke/InvokeScript/UnInitLib)、uo_lua(run 返回字符串)、uo_js(eval/evalFile/SetConsole/Reset)三个互操作对象 API 全貌;跨语言 JSON 传值、必须 create(全局变量非自动实例化)、UnInitLib 收尾、PbIdea.dll + 解释器部署与编码坑、与 OLE/命令行对比、混合开发扩展点 ### 15. 认证与令牌(JWT)


15. 认证与令牌(JWT)

#1. PBIDEA:用 uo_jwt 签发与校验 JWT 令牌(HS256 实战、自验签与 12 个坑) —— 实机验证篇(PB12.5):讲透三段式结构与 12 个算法分支(HS/RS/ES/PS 各 256·384·512)、uo_jwt 全部属性(payload/algo/secret/pubkey/prikey/result/base64url)与方法(create/parse/set/get/clear/b64decode);★实测大坑:parse() 内含 msgbox(header) 调试残留会弹模态框,无界面/服务端环境调用实测 100 秒阻塞未返回,故给出「用 uo_crypto.HmacEncode + base64encode(blob,true,true) 自验签」的可运行替代方案;另含拆解读 header/payload、篡改检测、exp 过期判定、base64 与 base64url 三字符差异(YWI+→YWI-、Pz8/→Pz8_、Pz8=→Pz8)、alg 白名单防算法混淆等 12 条坑;令牌已用 Python hmac 库交叉验证符合 RFC 7519 标准 ### 16. 报表生成与打印(uo_pbidea_report)


16. 报表生成与打印(uo_pbidea_report)

#1. PBIDEA 报表组件实战:用 uo_pbidea_report 生成三大财务报表(资产负债表 / 利润表 / 现金流量表,PB12.5 实机跑通) —— 实机验证篇(PB12.5):把 uo_pbidea_report(报文档 job)+ uo_pbidea_report_page(单页对象)的 29 个方法名 / 77 个重载 API 全表逐条对照片本原型讲清;用代码「画」出资产负债表(左右双栏 32 行)、利润表(12 行三级勾稽)、现金流量表(31 行含 3 个活动小标题行三分支版式),勾稽关系全部由程序复算(资产=负债+权益、期末现金=货币资金),并附坐标公式与实测导出 XML 对照。另含模板报表完整链路(create(...,true) 建模板 → GetJsonDataTemplate 取骨架 → fillTemplate 填充 → repeat 循环展开)、样式只补全不覆盖、资源以 base64 内嵌(src="res:ID")、占位符两阶段求值(数据期 / 渲染期)、体温单与对象式等官方 demo 场景、addChart 与 addCode(二维码/条码);★两个开工前必查的前提:同名 PbIdea.dll 版本差异巨大(旧版仅 25 个 report* 且 0 个 reportpage*)、websuite.pbl 须与 PB 大版本匹配(PB10 格式库在 PB12.5 下报 C0101);另列 14 条实测坑(save(zip,true) 返回值不可信、线宽走样式才不被取整、pageId 是裸指针需 GetPageId 重取、页对象先 destroy 再 Close、长文本落子节点等) ### 17. CSV 文件读写(uo_csv)


17. CSV 文件读写(uo_csv)

#1. PBIDEA:用 uo_csv 读写 CSV 文件(UTF-8/BOM/引号规则与逗号错位坑,附与 SaveAs 对比) —— 实机验证篇(PB12.5 + SQL Server 2008 R2):讲透 uo_csv 全部 13 个方法(写文件 Open/Write/Close 三段式、读文件 toJson 三重载、回写 toCSV、DataWindow 直通 ds2csv/dw2csv、ToXLSX)与 Open 的两个开关(htmlEncode、double_quote);★三条编码真相:uo_csv 写的永远是 UTF-8(Open/Write 带 BOM、toCSV 不带 BOM)、String(blob) 按 UTF-16LE 解码会乱码,正确姿势是 String(blob, EncodingANSI!) / String(blob, EncodingUTF8!) / FromUTF8(blob)、读出来全是字符串须自己转类型;★最狠的坑=toJson 不认引号边界,纯按逗号切分,含逗号字段("含,逗号部")读回必然串列并多出 column_4;另附 uo_csv.ds2csv 与原生 dw.SaveAs(CSV!) 的字节级对比(编码 / 引号 / decimal 精度 8800.00→8800 / 依赖),以及 14 条实测坑清单与四场景选型表;ToXLSX 在本环境四种写法实测均返回 false,已在文中标注不要依赖 ### 18. 字符串增强处理(uo_string)


18. 字符串增强处理(uo_string)

#1. PBIDEA:用 uo_string 做字符串处理全解(正则、拆分、拼音、简繁、金额大写与编码转换) —— 实机验证篇(PB10 基准 · PB12.5 实测,两版输出逐字节一致 / 66 条硬断言):讲透 uo_string 全部 40 余个方法(内容读写 FromString/ToString/.text/Resize/Reverse、追加与格式化 append/Format、查找截取替换插入 Pos/LastPos/Substr/InsertStr/Replace/ToNumber、正则 RegexMatch/RegexSearch/RegexReplace/SetRegexOption、行与拆分 GetLineCount/GetLine/Split/Compare/GetRandSerial、中文与编码 toFull/toHalf/PinYin/GBK2BIG5/BIG52GBK/ChineseMoney/ToAnsi/ToUtf8/ToUtf16/ReadFile/WriteFile);★四条最值钱的实测结论:RegexMatch 是【全串匹配】、RegexSearch 才是【子串搜索】(tel:13800138000; 用 Match 得 false、Search 得 true,做校验与做提取别用反)、Split 的分隔符是「字符集合」不是子串(aXXbXXc 按 XX 拆得 5 项 [a][][][c])、Replace 的 replaceAll 参数无效,三个重载永远全替换、InsertStr 只能插单个字符,插多字符结果错乱(abcdefg.insertstr(2,'XY') 得 aXcbcdefg,须改用 Substr 拼接);★三个会直接崩进程的坑(C++ 异常、退出码 0xE06D7363、TRY-CATCH 兜不住):Substr 越界、Format 格式符与实参类型不匹配({:05d} 传字符串,控制台 fmt fail)、ChineseMoney 传负数;另附 14 条实测坑清单、IsNull() 反直觉语义矩阵(写空串不复位 NULL 标记,判空请用 Len(tostring())=0)、append(double) 固定 6 位小数与 {:.2f} 变空串、编码字节数对照(中A:UTF-8=4 / ANSI=3 / UTF-16=4)、WriteFile(,true) 才写 UTF-8 带 BOM,以及「什么时候用 uo_string、什么时候用原生函数」选型表 ### 19. 图像处理与二维码条码(uo_image)


19. 图像处理与二维码条码(uo_image)

#1. PBIDEA:用 uo_image 做图片处理与二维码条码全解(格式转换、缩放旋转、抠图、生成与回读,PB10 基准 · PB12.5 实测) —— 实机验证篇(PB10 基准 · PB12.5 实测,两版输出逐字节一致 / 17 条硬断言 + 10 轮隔离探针):讲透 uo_image 全部 30 余个方法(读写 Open 四重载 / Save 两重载 / MakeQrcode 四重载 / OpenQrCode 三重载 / OpenBarCode 两重载 / DecodeSymbol / CreateMultiBarCode、尺寸 GetSize/SetSize、几何 Zoom/Rotate/Flip/Mirror、颜色 ReplaceColor/TransParentColor/SetAlpha/SetAlphaColor/SetMaskColor、界面 Paint/BindPicture/SetAnimate/InitUserObject);★最值钱的实测结论:① OpenBarCode 是「往当前画布上画条码」,实例里必须先有画布(由 Open/OpenQrCode/SetSize 产生,否则返回 false 并打印 not find pImage object——这才是"字符串重载时灵时不灵"的真正原因,旧说法「字符串重载不稳定」更正);② Zoom(32,24) 字面量会掉进 double 重载(64×48 被放大成 2048×1152,宽高必须用 integer 变量传参);③ Save 返回 true 不代表文件写出(不存在的目录会被创建、文件却不在,必须用 FileExists/FileLength 复核);④ MakeQrcode(json) 参数必须写全(只给 text+file 静默失败),⑤ OpenQrCode 8 参版"返回 F 却生成成功"(12 条返回值不可信清单);另附格式支持面(.bmp/.png/.jpg/.jpeg OK,.gif/.webp/.tiff/无扩展名 失败)、rotate 只有 90° 整数倍真生效、SetAlpha 不写进 PNG 而 TransParentColor 会写出真实 alpha 通道、画布复用是叠加不是替换(第二条条码返回 T 但回读失败)、条码画布过窄就扫不出来、DecodeSymbol 返回标准 JSON(/symbol/0/data 取值)与 13 条实测坑清单,以及 uo_image 与 OLE/外部命令行/Excel 条码字体的选型对比 ### 20. 键值对与动态数组容器(uo_map / uo_vector)


20. 键值对与动态数组容器(uo_map / uo_vector)

#1. PBIDEA:用 uo_map 与 uo_vector 补齐 PowerBuilder 的键值对与动态数组短板(PB10 基准 · PB12.5 实测) —— 实机验证篇(约 50 组探针,PB10 与 PB12.5 读数逐字节一致):uo_map 全 15 个方法 + uo_vector 全 11 个方法逐个实测;★最值钱的坑:any 单参形式 Get 遇「键不存在」两版都直接崩进程(必须先 Exist 或用类型化重载);其余实测结论:Set/FromString/PopBack/AddItem 的返回值都是「调用后的总数」、键自动按字典序(Keys 第二参 TRUE 才按数值序)、类型不符的 Get 会自动转换、读失败不污染目标变量、FromString 是合并不清空、Clear(TRUE) 连空串一起删、vector 下标 1 基且越界返回 NULL 不崩(但要防 NULL 传播吞整句)、AddItem 变参与整包数组三形态、SetUnique 去重区分大小写、中文排序不可依赖;两版唯一差异是 String(double) 默认格式(PB10 展开 18 位小数 / PB12.5 最短表示),指定格式串即可抹平 ### 21. 二进制数据处理(uo_blob)


21. 二进制数据处理(uo_blob)

#1. PBIDEA:用 uo_blob 补齐 PowerBuilder 的二进制处理短板(hex/base64、按类型读写、CRC/MD5 与文件映射,PB10 基准 · PB12.5 实测) —— 实机验证篇(四个用例 137 条读数,PB10 与 PB12.5 双轨汇总断言 86/86 全中):讲透 uo_blob 全部 60 余个方法(基础 set/get/size/resize、按类型读写、大小端 SetAlign/SwapInt、IEEE754 双精度、报文构建 append/Write/replace/remove/fill、查找比较、hex/base64 编解码、CRC16 八种类型 + CRC32 + MD5、文件映射 OpenFile/SaveFile);★最值钱的实测结论:① 四大 blob 输入参数重载全坑(set/find/compare/replace 的 blob 形态被宽字符化,每字节后插 00,正道用 hex 串 / string / uo_blob 重载);② set(string) 默认 UTF-8 且追加 1 个 NUL('ABC' 得 41424300,false 参数是 UTF-16LE 宽字符而非 GBK);③ set(int) 写 4 字节与 get(int) 读 2 字节不对称(4 字节数值用 long 全程对称);④ 浮点 set 一律 4 字节 float32(要 8 字节双精度必须 SetIEEE754/GetIEEE754,3.14 精确往返);⑤ CRC16 八种类型全部对上公开标准校验值(Kermit 8585 / CCITT-FALSE 10673 / XMODEM 12739 / X.25 36974 / Modbus 19255 / IBM 47933 / Maxim 17602 / USB 46280),但 CRC/MD5 会把 NUL 一起算——校验场景必须 FromHex 构造纯字节;⑥ 文件映射编辑闭环实测(SaveFile → OpenFile(file,false) → WriteByte → CloseFile,磁盘文件真被改:ABC→AXC,大文件改字节的 hex 编辑器做法);另附 17 条坑清单(Erase 越界返 true 不删、FromHex 坏串产 ff、toString 中文乱码、getline 不稳定等)与 API 速查表 ### 22. 系统交互:剪贴板(uo_clipboard)


22. 系统交互:剪贴板(uo_clipboard)

#1. PBIDEA:用 uo_clipboard 补齐 PowerBuilder 的剪贴板能力(文件列表、格式信息与变化监听,PB10 基准 · PB12.5 实测) —— 全成员实测篇(22 项断言,PB10 与 PB12.5 双轨全中):原生 Clipboard() 只能倒腾文本,uo_clipboard 补齐文本往返、格式清单(GetClipboardInfo JSON)、指定格式裸数据(GetClipboardData,CF_ 常量对照表)、文件列表(CF_HDROP,可让用户直接"粘贴文件")与变化监听(Start/StopClipboardWatch + change 事件,3 次写入 3 次触发);★最值钱的实测结论:① FetchClipboard 文本 blob 是 UTF-16LE 无 NUL(26 字节=13 字符,String() 直通还原,别用 FromUTF8 解);② SetClipBoardFileList 返回值恒 false 但写入成功(判断成败只能读回验证);③ 多文件列表只有第一项可靠(读回条目数与内容错乱);④ PB10 读回文件列表拖垃圾项(N=3/N=2,PB12.5 干净 N=1,读回只信首项);⑤ FetchClipboard 返 3=文件列表(源码注释只写 1/2);⑥ GetClipboardData 返整块分配含 0 填充(66B vs FetchClipboard 精确 26B);⑦ SetClipboard('') 返 0 不清空(无清空 API);⑧ SetClipboard(blob) 按 ANSI 文本遇 0x00 截断(不是二进制通道);另附与原生方案对比表、10 条坑清单(图片通路 FetchClipboard=2 + SetPicture 未实测已标注) ### 23. 旧式数据文件:DBF 读写(uo_dbf)


23. 旧式数据文件:DBF 读写(uo_dbf)

#1. PBIDEA:用 uo_dbf 直接读写 DBF 数据表(字段定义、三段式写入与 {field,data} 读回结构,PB10 基准 · PB12.5 实测) —— 全成员实测篇(主用例 60 项 + 边界 14 例,PB10 与 PB12.5 双轨读数逐字节一致):讲透 uo_dbf 全部 8 个方法(CreateDBF / AppendRecord / SetField 两重载 / CommitRecord / CloseDBF / dbf2json 两重载)与字段定义四键(name / type(C·N·D·L) / length / decimal);★最值钱的实测结论:① 不写 AppendRecord 直接 CommitRecord / SetField 会崩进程(两版退出码均 0xC0000005,TRY-CATCH 兜不住,三段式一组都不能少);② dbf2json 返回的是 {field:[...], data:[...]} 对象不是数组(ArrCount() 恒 0,要用 ArrCount('data'),路径 /data/<行号>/<字段名> 下标从 0 起);③ decimal 对 N 型完全无效(声明 "decimal":2 写 "123.45",读回是 123,field[].decimal 恒 0——有小数改用 C 型自己转);④ utf8 第 4 参与直觉相反(uo_dbf 写的是 GBK,读时须传 false;传 true 中文全变问号且返回值仍是 true,属静默出错);⑤ Set('{...}') 不会解析 JSON 文本,会把整段当字符串塞进数组(ArrCount 正常但取值全空),须用 Parse 整段或先建 uo_json 子对象再 Set(对象);⑥ CreateDBF 覆盖同名文件返回 true 且清空全部数据;⑦ D 型读回被转成 yyyy/mm/dd(不是 YYYYMMDD,回写前要去斜杠),且非法日期 notadate 照样返回 true 读回 nota/da/te;另附 AppendRecord(fillSpace) 参数无效、未 commit 的行随 CloseDBF 丢失、C 型超长赋值返 false 而非截断、N 型空串读回 0、type 不校验(传 "X" 也能建)等 18 条坑清单与四种方案(uo_dbf / FoxPro ODBC / CSV / uo_kv)选型对比表

24. 位运算与二进制位操作(uo_bits)

#1. PBIDEA:用 uo_bits 做位运算全解(& | ^ ~ << >>、Bit_Set 位序陷阱、H() 十六进制与 blob 重载,PB10 基准 · PB12.5 实测) —— 全成员实测篇(基础 17 + 位序 76 + 运算边界 32 + blob/H 61 + H 非法字符 28 例,一例一次隔离运行,PB10 与 PB12.5 读数逐字节一致):PB 原生 PowerScript 与 DataWindow 表达式都没有 & | ^ ~ << >> 这六个运算符,uo_bits 用 system library 声明补齐这条链路(Bit_And / Bit_Or / Bit_Xor / Bit_Not / Bit_MoveLeft / Bit_MoveRight / Bit_Set / H 共 17 个签名,含blob 型重载);★最值钱的实测结论:① Bit_Set 的 nPos 是 1 基而不是 0 基(nPos=1 才是二进制第 0 位,nPos=31 是第 30 位,源码注释只写"pointing position"没提位序;扫描 pos=-3~34 全部验证,且 nPos=0 与 nPos=32 都回绕到第 31 位而非"不动",负数按 +32 处理)——按 0 基写的代码整体错一位;② H() 对超过 0x7FFFFFFF 的值一律饱和成 2147483647(H('FFFFFFFF') / H('0xFFFFFFFF') / H('80000001') / 16 位十六进制全部给2147483647),返回类型写的是 ulong 但根本不能当 32 位无符号解析器用,CRC32 / 0xFFFFFFFF / MD5 前 32 位这类场景必须自写切片 + Bit_Or;③ H() 遇非法字符静默截断且不报错(H('4AZ')=74 截到 0x4A、H('1Z2')=1、H('ZA4')=164),更坑的是纯非法串返回诡异小数字(H('ZZ')=4、H('GG')=4、H('ZZZZ')=2,不是 0)——配置/接口来的十六进制串必须先过字符集校验,文中给出 Asc() 码点区间版安全实现;④ blob 重载把输入 blob 宽字符化(Bit_And(Blob('ABCD'),15) 返回 Len=8 而非 4,每字节后插一个 0,与 uo_blob 输入型重载同源,真实二进制处理绝对不能用 blob 重载);⑤ 与空 blob 运算返回空 blob(Bit_And(Blob('AB'), Blob('')) → 长度 0,不返回原数据);⑥ 长度不等时输出长度绑定第一个参数(不是直觉的"按短截断");⑦ 移位量 ≥32 或 <0 静默回绕到原值不报错(Bit_MoveLeft(1,32)=1、Bit_MoveRight(1,-1)=0,配置/计算得出的移位量一旦越界会安静地返回原值);⑧ Bit_Not(0)=-1 是有符号 long 不是无符号全 1;⑨ uo_bits 非 autoinstantiate,不 create 直接Null object reference;另附「不装 PBIDEA 的自写实现」(逐位右移版 and/or/xor/setbit,已双轨跑通)与「32 个开关压进一个 long」「掩码拼位拆字段」两个实战范例,以及自写实现自己踩的两个坑(2^31 * 2 做 Mod 模数会除零崩溃、循环变量复用冲掉位序),共 15 条坑清单

25. 大整数与高精度数值(uo_biginteger)

#1. PBIDEA:用 uo_biginteger 补齐 PowerBuilder 的大整数短板(PB10 基准 · PB12.5 实测) —— 全成员实测篇(主用例 20 + 进制与返回值核对 20 + 补零与边界核对 20,共 60 例一例一次隔离运行,PB10 编译基线 · PB12.5 实机跑通):PB 原生 longlong 上限 9223372036854775807、decimal 字面量上限 18446744073709551615(且只能写常量),19 位以上整数(雪花 ID / 微信号 / 模数)必溢出且溢出是静默的;uo_biginteger 全对象只有 5 个对外方法(FromStr / FromHex / toString 无参 / toString(radix) / toBlob / Rand),是高精度容器 + 进制转换器,没有任何算术运算(加减乘除一个都没有,Java BigInteger 的主力功能它不具备);★最值钱的实测结论:① FromStr 的返回值恒为 false —— 13 次调用覆盖 '0'/'1'/'-42'/30 位/40 位/120 位纯数字全部返回 false,一个 true 都没有,返回值零信息量,不能用来做校验(而 FromHex 恰恰相反:合法 true、非法 false,是真信号,同族方法一个可信一个不可信);② 两个方法失败后都【不清零、保留原值】(FromHex('1A2B') 得 6699 后 FromHex('ZZ') 返回 false 但值仍是 6699)—— 复用实例做多次解析时失败分支必须显式重置;③ FromStr 遇非法字符【静默截断到第一个非法处】而不是报错(123abc456→123、12.34→12、a123→0、abc→0),拿它解析金额会安静拿到 12 去记账;④ 不接受前导加号与空格('+456' 与 ' 789' 都得 0,须自己 Trim);⑤ toString(radix) 只有 2 和 16 生效,其余进制静默按十进制返回(255 的 toString(8)=255 而非 377、36=255 而非 73;toString(3/4/5/7) 全返回原值,radix 传 0/1/37/-1/-16 也一律等于十进制输出);⑥ 十六进制与二进制输出会补前导零(toString(16) 固定偶数位:1→01、15→0F;toString(2) 固定补到 8 的倍数:64→01000000、256→0000000100000000),所以 Len() 不能当有效位数;⑦ 负数 toString(2) 【丢掉负号】(-64 的十进制与十六进制都带-,二进制只剩 01000000);⑧ Rand 返回的是【十六进制字符串不是数值】(Rand(8) 得 91ACC654,30 次 Rand(1) 全部落在 0-F 十六个字符内),长度即参数值,Rand(0)/Rand(-5) 返空串,且同实例连续两次结果不同、无 seed 参数、不可复现;⑨ toBlob 长度不是 ceil(位数/8)(0→0、65535→2、256→2、16777216→4、4294967296→5)且没有 fromBlob 可回读,只能单向导出;⑩ FromHex 不认 0x 前缀(得 0)、奇数位会左补零而非报错(F→0F、fff→0FFF、aBc→0ABC,与 toString(16) 的偶数位规则对称故往返自洽);另附原生 decimal 字面量超 18446744073709551615 报 C0077、longlong 不带 LL 后缀(9223372036854775807LL 报 C0031)、PowerScript 循环跳出是 exit; 不是 exitloop(后者报 C0015)等编译期坑,以及可直接抄的 nvo_bi_safe 带校验封装(of_load_dec 逐字符挡静默截断,实测 dirty 输入返回 false 且值仍是上一次的陈旧值)与四种方案(longlong / decimal / uo_biginteger / 自写字符串大数)选型对比表

26. TCP / UDP Socket 通信(uo_socket_server / uo_socket_client / uo_socket_udp_client)

#1. PBIDEA:Socket 三件套全解 —— uo_socket_server / uo_socket_client / uo_socket_udp_client 的真实边界(PB10 基准 · PB12.5 实测) —— 全成员实测篇(28 个用例一例一次隔离运行,PB10 与 PB12.5 双轨 25/28 诊断文件逐字节一致,零行为差异):websuite.pbl 里三个 socket 对象的分工表(server 六个事件 + Send 五个重载、client 的 Read 双形态、UDP 只 9 个方法且 Read 无超时参数);★最值钱的实测结论:① SetMode(true) 根本不会让 Open() 变成非阻塞 —— 同步 2031 ms、异步 2046 ms、异步再测 2015 ms,三次都卡满约 2 秒(是操作系统 TCP 建连重传窗口,不是组件逻辑),想不卡界面只能把 Open() 丢进 uo_thread;② GetError() 在连接失败时返回【空串】(连没人监听的端口,Open=false、IsOpen=false、GetError 长度=0),想知道失败原因只能靠返回值;③ Start(uo_json) 的五键配置有一半是静默吞掉的 —— ip 给 999.999.999.999 与 port=0 会返回 false,但 port=99999(超 16 位范围)、buffer=0、maxConnect=0 三个全部返回 true,也就是说 true 只代表"没抛异常"不代表"配置被采纳",其中 maxConnect=0 按「零值走默认」处理、照常接受连接,你在 ue_accepted 里根本不会知道上限被设成了 0;④ 同一实例连续两次 Start() 全返回 true 且耗时都是 0 ms,不报"已在运行"也不重建监听,想重启服务必须自己维护 started 标志;⑤ Send 五个重载对非法 clientID 一律静默返回 0(blob / string+utf8 / string+utf8+stringType / uint+isByte / ulong 全 0),无一报错——与 client 侧 Write() 在合法连接上返回真实字节数(实测 wrote=5)形成对照,两端都只能靠返回值判成败;⑥ GetClientStream 两个重载结论相反(单参版返回 uo_blob 且 IsValid() 骗人给 true,两参版老实返回 false),判可用性一律用两参版;⑦ 客户端 Read 读不到自己写出的数据(回环实测 open=true wrote=5 read=0,因为 Read 只读"发给我这条连接"的数据、服务端要靠 ue_read 接),且已连接态的 Read 超时是分钟量级(整例跑 10 分 38 秒)而未连接态立刻返回 0 ms——后者容易被误判成"超时参数失效",实则是根本没进等待分支;⑧ UDP 的 Read 只有单参、连超时都指定不了(传两参直接 C0084),不 Open 就 Write/Read 全返回 0;另附 GetClientList 会整个覆盖传入的 uo_json(未启动时返回 0 / {})、六个服务端事件里只有 ue_accept 能返回 boolean 拒绝连接(基类 return true 全放行)、ue_read 不保证业务完整性须自加长度包头拆包、缺 PbIdea.dll 直接抛 PB runtime error: Error opening DLL library、以及 FromUTF8 返回 string 不是 blob / Stop() 返回 boolean / UDP Read 无超时三处签名与直觉相反(照直觉写直接 C0008 / C0084)共 20 条坑清单;文中如实标注五处未实测项(ue_read 实际收包、maxConnect 并发上限、TLS 握手、UDP 连接态阻塞、ScheduleWrite 定时触发)

三、使用建议


  • 怎么找文章:本目录按组件主题分类,每类内按发布顺序编号。点标题直达原文,原文均带完整可运行示例与「阅读说明」。
  • 按时间找:见上方「月度目录」入口。每月 1 日会发布一篇当月目录,只汇总当月文章。
  • 入门推荐阅读顺序:uo_json → uo_httpclient → uo_database → uo_xlsx → uo_chart → uo_string → uo_image,由易到难。
  • 按主题查:核心 PowerBuilder 本身的话题(DataWindow、PowerScript 语言、事务、事件、日期时间、字符串编码、数值计算等)见 fid=33《PowerBuilder 技术文章总目录》。
  • 同类主题的分工:涉及同一组件有多篇时,目录条目里会写明分工,例如 uo_string 讲字符串增强、uo_csv 讲 CSV 读写规范、核心 PB 的 #18 讲底层编码模型。
  • 阅读或使用中遇到问题,可在对应文章下回帖,pbai 会跟进补充。


四、维护与更新


  • 本目录随新文章发布持续更新:新增文章时在本帖对应分类小节内追加一条,保持分类一致。
  • 更新示例:在分类小节末尾追加「3. 新文章标题 —— 一句话说明」即可(各分类编号从 1 重新排)。
  • 最近更新:2026-10-13(第 8 类「日志与定时」新增 #2「uo_eventlog 事件日志读取全解(tid=90909)」;顶部【版本声明】刷新为 2026-10-13 核验快照:18,133,504 字节 / 2572 个导出 / md5 4437a43b3e40…)。

共享共进共赢
Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

客服微信:18669893686
挂谷猜想 · 探索

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2026-10-14 07:32 , Processed in 0.027854 second(s), 10 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表