
简介面向Delphi 12.3开发者的nSoftware-IPWorks网络通讯组件包是2024年9月4日发布的版本专用于在RAD Studio中快速集成邮件、FTP、HTTP、POP3/SMTP等网络协议以及SSL加密、云存储、消息队列等能力适合需要处理底层通讯代码的桌面与跨平台应用开发。压缩包共2000个文件约382.88MB其中以dproj、dpr、bdsproj工程文件pas、dfm源码与窗体文件bpl运行库为主另含大量HTML、CSS、JavaScript、TXT文档与脚本以及DLL、SO动态库目录结构清晰。目前已有136人学习/下载。通过包内官方示例和API文档开发者无需从零编写通讯底层即可快速为Delphi项目添加文件传输、安全认证等复杂功能该组件还支持跨平台部署和多语言环境并附有更新日志与部署文件便于在金融、医疗等安全要求较高的场景中稳定落地。1. 为什么 Delphi 12.3 项目还要装一套 nSoftware-IPWorks需求清单与选型前的底层判断接手一个 Delphi 12.3 维护项目最头疼的不是界面而是那些绕不开的网络协议设备那边只暴露 SNMP 接口文件服务器只开 SFTP板卡上传数据用的是裸 TCP 私有协议。用 Indy 能完成一部分但 SNMP 和 SSH 这类协议在 Indy 里要写的胶水代码太多调试起来像在翻黑匣子。nSoftware-IPWorks 就是把这一整类协议封装成 VCL 控件的商业套件TIPSFTP、TIPSSH、TIPSNMP、TIPHTTP 覆盖了从设备管理到数据交换的主流场景。这个打包日期 2024-09-04 对应的就是跟着 RAD Studio 12.3 走的版本很多学习 Delphi 的朋友在搭企业级工具时都会先确认这套控件。下面按“装完能用、能排错、能复现”的顺序把这套控件落到 Delphi 12.3 的工程里。2. 认准控件族谱再动手IPWorks 的协议矩阵与两种典型场景2.1 TIP 前缀的命名规则从协议名到控件名的映射IPWorks 的 Delphi 版本从命名上就能看出它在网络协议上的野心几乎每个协议对应一个 TIP 开头的控件。常用的有 TIPHTTP、TIPFTP、TIPSFTP、TIPSSH、TIPSNMP、TIPSMTP、TIPDNS、TIPWebSocket、TIPTCP、TIPUDP、TIPIPInfo、TIPIPMonitor 等等。这个控件命名规则能帮你省掉一半查文档的时间看到协议名就能猜到控件的名称和默认单元名。比如项目里要写一个 SFTP 文件同步不需要引入整个 SSH 协议栈直接拖一个 TIPSFTP把服务器地址、账号、私钥路径填上剩下的就是调方法和接事件。不过也要注意IPWorks 是几十个控件组成的套件不是某个控件单独发布。Delphi 12.3 的安装包里你会同时看到几类东西编译好的 .bpl 和 .dcu是给 Delphi 编译器直接用的运行时包和预编译单元source 源码目录部分授权会附带用于重新编译或者将来升级到新 Delphi 版本samples 示例工程这是最该先看的东西尤其对协议解析类控件官方示例里的用法比帮助文档更接近真实场景。选型时第一个要考虑的问题是你买的是哪个子集。有些项目只需要 HTTP 和 FTP有些则必须 SSH 和 SNMP。我的习惯是先列一张需求清单协议、方向上行还是下行、是否需要证书校验、是否需要异步处理。把清单拿去核对包内文件这个粒度足够帮你判断该用哪一组控件也方便后续确认 .rar 里到底有没有缺文件。别等到项目编译期再发现少了个 dcl 包那时再找供应商补文件交付节奏就乱了。2.2 按业务场景选控件数据交换与设备管理是两种打法尽管控件很多落地时通常只有两类场景。一类是数据交换。典型需求是程序要把文件推到内网 FTP或者从某台服务器拉取数据。这类直接选 TIPFTP、TIPHTTP、TIPSFTP。TIPHTTP 支持 HTTPS 和证书回调适合对接 Web 后端TIPSFTP 针对 SSH 文件传输做了优化比如主机密钥校验、私钥登录适合不允许开明文 FTP 的环境。数据交换场景的核心不是控件本身而是文件切分、断点续传、超时和错误恢复策略——控件负责协议剩下的状态机还是得自己设计。另一类是设备管理。公司内网的交换机、路由器、NAS 大多暴露 SNMP 接口Linux 服务器则靠 SSH 远程管理。这类场景常用 TIPSNMP 和 TIPSSH。SNMP 控件的价值在于把 OID 查询、MIB 解析、Trap 接收封装成属性和事件这在纯 Socket 层面自己写很难做到跨设备兼容。SSH 控件则适合做远程命令执行和日志采集配合 SFTP 可以把“登录采集、回传文件”这条链路串起来。下面这个表是两类场景的控件选择参考场景类型常用控件关注点数据交换TIPHTTP、TIPFTP、TIPSFTPRange 续传、超时、证书回调设备管理TIPSNMP、TIPSSHOID 解析、KEX 算法、命令通道网络基础TIPDNS、TIPIPInfo、TIPIPMonitor域名解析、网卡枚举、状态变化值得注意的是选型阶段不要在控件数量上贪多。一个项目里真正用到的 IPWorks 控件一般不超过五个。控件越少版本冲突和授权合规问题越少。有些开发者习惯把所有 IPWorks 控件安装完就顺手拖到窗体上结果编译产物体积变大不说还容易在后续升级时被无关控件的版本更新牵连。2.3 版本匹配要看包内文件名.bpl、.dcu、.dpk 各代表什么装之前先别急着解压拖进 IDE。先确认这个包是不是匹配 Delphi 12.3。怎么看打开 .rar 里 lib 或 redist 目录文件名里通常带有包名和版本信息比如 ipworks 加数字结尾的命名。重点看三点有没有对应 32 位和 64 位的目录。Delphi 12.3 默认可以同时做 Win32 和 Win64第三方包必须两个平台都提供否则切换平台时控件会消失。有没有 dcl 前缀的包。dcl 开头的是设计期包运行时不出现在 Install Packages 里就看不到控件面板非 dcl 的是运行时包只负责在程序分发时跟着 exe 走。有没有源码 .dpk。没有预编译包时可以用 .dpk 在 IDE 里自己编译但这需要你有源码授权光有 .dcu 没有 .dpk 是没法重新编译的。到这里标题里 2024-09-04 这个日期就有用了。它告诉你这是跟着 2024 年那批 RAD Studio 12 更新节奏走的包编译器版本大概率对得上。反过来如果你手上是还在用 Delphi 7 的老项目那这个日期的包可能根本装不进去——旧版 Delphi 的包格式和新版 RAD Studio 不兼容。版本匹配这个坑比控件本身好不好用更提前出现也更容易让人在安装阶段就翻车。3. 把 IPWorks 装进 Delphi 12.3解压、路径与 IDE 注册的三步走3.1 解压 .rar 后先核对目录结构解压后别双击 .bpl 试图“运行”它先把目录看清。干净的 IPWorks 分发包通常长这样docs 或根目录下有帮助文档和 Release Noteslib 下放 .bpl、.dcu、.bpi按 win32 和 win64 分目录source 下放 Delphi 单元源码和 .dpk通常用于重编译samples 下放可打开即跑的示例工程。具体的目录名可能略有差异但结构基本是这种风格。这里最容易踩的坑是把 source 和 lib 混在一起加路径。编译器找的是 .dcu不是 .pas。把 .pas 放进搜索路径虽然也能触发重编译但容易在 IDE 里产生“同一个单元两个来源”的怪问题。我一般只把 lib 目录加进库路径source 目录单独留着只在需要跟代码确认控件行为时才打开看。另一个小细节是解压路径不要带中文和空格Delphi 的包管理对 Unicode 路径的支持虽然比老版本好但第三方包安装阶段少一点变量就少一点风险。3.2 配置 Library Path先修默认路径再追加第三方路径在 Delphi 12.3 里打开 Tools Options Environment Delphi Options Library右侧可以看到 Library path、Search path 和 Browsing path 三栏。和第三方控件相关的只有 Library path 和 Search path。把 IPWorks 解压目录里的 lib\win64 和 lib\win32 分别加进去注意当前项目是 32 位还是 64 位两个平台建议都加以后切换平台不用回头再改。这里要先说一句默认路径。很多人装完第三方包编译报错报的不是 IPWorks 单元而是 Delphi 自带的比如 msxmldom.dcu not found。这个现象说明 IDE 默认的库路径已经被改乱或者缺失了一段第三方包只是把问题暴露出来。先点 Library path 文本框右侧的按钮确认列表里包含 $(BDSLIB)\win32\release 这类默认项再往上追加 IPWorks 路径。默认路径修好、第三方路径追加完之后新建一个工程编译空 Form确认没报 dcu 错误再继续后续安装。先把环境恢复正常别带着病根往下走。3.3 安装设计期包Component Install Packages 加载 dcl 开头的 .bpl路径配置只解决编译期。要在组件面板里拖控件还得让设计期包进入 IDE。操作不复杂但顺序有讲究菜单 Component Install Packages在右侧 Installed packages 列表下方点 Add浏览到 IPWorks 解压目录选择 dcl 开头的 .bpl 文件确认包名出现在 Installed packages 列表并把前面的勾打上确定后到组件面板搜索 TIP看控件图标是否显示。如果控件面板里没出现不要反复重装。先重启 IDE再回到 Install Packages 看包是否真的处于勾选状态。很多时候是 IDE 在包安装后没有刷新工具栏面板重启一次就好。另一个常见原因是你装的是运行时包而不是设计期包Installed Packages 对运行时包也会显示安装成功但组件面板里永远不会有控件。判断办法就是看包名有没有 dcl 前缀没有的话去找到正确的设计期包再装一次。提示安装包全过程不需要管理员权限但如果你把 .bpl 复制到了 C:\Windows\System32就在动手前劝退自己——这是 ActiveX 时代的旧习惯VCL 包放到 IDE 的 bin 目录即可。如果真的装的是 ActiveX 控件版本安装路径完全不同需要先 regsvr32 注册 DLL再从 Component Import Component 导入类型库。这也是为什么我建议先分清 VCL 版和 ActiveX 版的差异。标题里这个 .rar 如果带的是 .bpl、.dcu 和 .dpk就按 VCL 流程走只有当你看到 .dll 和 .tlb 时才去考虑 activex 控件安装那套流程。3.4 装完先做冒烟验证空白工程拖控件编译一次装完控件第一步不是写业务代码而是建一个空白 VCL 工程把要用到的 TIPHTTP、TIPSFTP 各拖一个到窗体上设置几个属性编译运行一次。这一步能过滤掉大部分版本问题空工程能编译说明路径和包都正常编译过了但运行时报“类未注册”或“找不到指定模块”说明包没装全或者依赖了别的包。冒烟验证不需要写任何业务逻辑控件能拖上去、属性能在 Object Inspector 里显示、空 Form 能跑起来就算过关。真正写业务代码之前把环境问题先清零后面排查才不会混成一片。4. 第一个可复用工程用 TIPHTTP 写一个带断点续传的下载器4.1 最小可运行代码从 URL 带进度下载到本地文件业务场景内网工具需要从 HTTP 服务器下载安装包网络质量不佳下载到一半断开是常事所以要求支持断点续传。用 IPWorks 的 TIPHTTP 实现并不复杂核心是把这次要下载的字节范围告诉服务器。代码如下// 拖一个 TIPHTTP 控件到 Form命名 httpDown // 单元引用按控件实际包名调整常见为 ipworkshttp uses ipworkshttp, System.SysUtils, System.IOUtils; procedure TForm1.btnDownloadClick(Sender: TObject); var tmpFile: string; localSize: Int64; begin httpDown.TransferTimeout : 60; // 单次传输超时单位秒 tmpFile : ExtractFilePath(Application.ExeName) update.bin; // 已存在的文件大小作为续传起点 if FileExists(tmpFile) then begin localSize : TFile.GetSize(tmpFile); httpDown.Range : localSize.ToString; // 让服务端从 localSize 字节开始回数据 end else httpDown.Range : 0; httpDown.LocalFile : tmpFile; // 响应体写入本地文件而不是留在内存 httpDown.Get(https://download.example.com/update.bin); if httpDown.LastStatus 200 then Memo1.Lines.Add(下载完成: tmpFile) else Memo1.Lines.Add(HTTP httpDown.LastStatus.ToString); end;代码逻辑不复杂但有两处值得说明。Range 属性是断点续传的关键服务端支持 Range 请求时会用 206 Partial Content 响应从指定偏移量继续传输。传输结束后别忘了一个细节下一次下载前要把 Range 状态理清楚否则同一控件重复使用时可能继续沿用旧偏移。LastStatus 保存最近一次请求的 HTTP 状态码判断成功与否尽量用它不要用异常来当流程控制。TIPHTTP 的 Get 是同步阻塞的这个方法会在网络传输全部结束才返回。如果你的 UI 在这个循环体里窗体就会卡住。常见做法是把它放进 TThread 或 TTask通过 Synchronize 把进度回调到界面。控制台工程没有 UI 阻塞问题但我仍然建议放到线程里方便同时处理多文件任务。同步阻塞不是 bug用错线程才是。4.2 关键参数表TransferTimeout、LocalFile、Range 与断点续传几个常用属性值得记下来它们是这个下载器能不能在真实网络里活下来的关键。下面这个表是我调试时反复调整过的参数属性含义建议值或用法TransferTimeout单次读或写超时单位秒内网 30 到 60外网按链路质量放宽LocalFile响应体写盘路径大文件务必设置避免内容留在内存Range请求的字节范围断点续传、分片下载都靠它OtherHeaders追加自定义请求头加认证 Token 用注意别覆盖内置头LastStatus最近一次请求的 HTTP 状态码判断 200/206/404比异常可靠这里重点说 LocalFile。不设置 LocalFile 时响应内容会通过事件的 Text 参数传给你小接口没问题大文件千万别这么干——内存会被一次下载撑爆。设置 LocalFile 后控件会把响应体直接写盘。断点续传时Range 和 LocalFile 配合能实现“接着上次的位置继续写”而不是覆盖整个文件。然后是 OnTransfer 事件。每传输一块数据就会触发一次参数里有 BytesTransferred 和 PercentDone。用它更新进度条时不要每次都刷新 TProgressBar界面会闪烁得很难看控制在 10% 更新一次比较合适。还有一个容易被忽略的纪律OnTransfer 里禁止再去调用这个控件的其他方法。控件内部状态正在处理数据重入会导致不可预期的行为这是 IPWorks 事件回调里的硬规矩。4.3 事件驱动的三个陷阱OnTransfer、OnSSLServerAuthentication、OnError第一个陷阱是证书校验。走 HTTPS 时首次连接会触发 OnSSLServerAuthentication 事件参数里有 CertSubject、Accept 等字段。开发环境图省事可以直接 Accept : True但生产环境要校验证书指纹或链。很多线上事故不是协议问题而是把 Accept 写成了永久 True导致中间人攻击。我一般建议把证书校验做成配置项调试模式放行生产模式强制校验。第二个陷阱是 OnError 事件与 LastStatus 的关系。某些版本里服务端返回 404 会触发 OnError但没有异常抛出LastStatus 会保留为 404。于是很多人写代码时以为“网络没报错就是没问题”结果下载了个 HTML 错误页进度条走完才发现文件不对。正确做法是下载完成后检查 LastStatus 和文件大小两个都符合预期才算成功。第三个陷阱是 Range 与服务器行为差异。有些服务器不支持 Range 请求收到 Range 后直接返回 200 全量数据。这样一来续传时会覆盖本地文件头部。处理方式下载前先发一个 HEAD 请求看响应里有没有 Accept-Ranges没有的话就不要续传直接重新全量下载并把本地文件删掉。别指望 IPWorks 帮你决定策略它只负责把请求发出去续传策略是使用者的事。5. IPWorks 避坑与排查五个容易翻车的现场5.1 编译报 dcu not found 时先查默认库路径现象新装 Delphi 12.3加好 IPWorks 路径编译一个小程序时 IDE 报 File not found: IPWorks.dcu或者直接报 msxmldom.dcu not found。这个报错很有迷惑性因为你明明已经把 IPWorks 的目录加进 Library path 了。原因第三方包路径加得没问题但 IDE 的默认库路径里缺失了系统自带单元目录。很多老工程师图省事直接修改默认 Library path导致 Delphi 自己单元的 .dcu 找不全。msxmldom 是 Delphi 自带的 XML 单元它都找不到说明默认路径缺得不是一点半点第三方包只是把问题暴露出来。解决先不要动第三方包回到 Tools Options Library确认列表最前面有 $(BDSLIB)\win32\release、$(BDSLIB)\win64\release 等默认条目缺了就手动补回。等空工程编译通过再把 IPWorks 路径追加进 Search path。每次装控件前先确认默认路径是完整的能省掉一整类报错排查。5.2 Unit 版本不一致多个 IPWorks 版本残留在 Library 路径现象编译报 “Unit IPHTTP was compiled with a different version of System.SysUtils”或者 “Cannot load package ... It contains unit ... which is also contained in ...”。原因最常见的是电脑里装过不止一份 IPWorks不同版本都往 Library path 里写了一条路径。Delphi 编译时会把所有路径上的 .dcu 都纳入候选结果两个 IPHTTP.dcu 同时存在编译器随机取了先找到的那份两份对 System.SysUtils 的版本预期不一致就爆出这个错。这个问题的特点是不会每次稳定复现编译前清没清缓存都会影响结果排错排到后面很像玄学。解决打开 Library path把 IPWorks 相关目录清到只剩一个然后 Project Clean删除项目 output 目录里的所有文件再 Build。如果还报错用搜索工具全盘搜一下 IPHTTP.dcu把老版本残留删掉或者手动移出。这条坑治好了一般不会复发。装新版本之前先把旧版本卸载干净这个习惯比任何排查技巧都重要。5.3 TIPSFTP 连不上算法协商失败的排查思路现象用 TIPSFTP 连某台内网 Linux 服务器对方日志显示连接被断开控件或服务器返回类似 “algorithm negotiation failed” 的错误。很多人第一反应是账号密码错了反复检查无误后开始怀疑控件。原因服务器端 OpenSSH 较新版本默认关闭了老式 ssh-rsa/SHA1 签名算法而控件或本地加密库还在用旧算法协商。这是客户端和服务器在第一个握手上就没有共同语言不是登录阶段的问题。这类问题从 2019 年后更新的 OpenSSH 上开始批量出现新装的服务器踩中概率很高。解决优先把控件升级到较新版本然后调整控件提供的 KEX、签名算法相关配置把 ssh-ed25519、rsa-sha2-256 放到算法列表前面。注意不要为了绕过问题而在服务器端重新开启 ssh-rsa这是把安全口子重新打开等安全审计查出来比升级控件麻烦得多。每一处算法配置的修改都要让服务器运维知悉并留档。5.4 运行期弹出评估授权窗试用版与正式版混装现象程序装上后跑一段时间突然弹出试用提醒对话框点确定之后程序才继续。这个现象发生在运行期而不是编译期很多人会误以为控件的某个属性没设对。原因画的 .bpl 是评估版。商业控件评估包通常是不装调试器时限制运行时长或限制部分功能而不是直接拒绝编译。所以编译期一切正常跑起来才暴露授权状态。解决确认授权类型。正式授权通过官方安装包或 License 文件激活评估版不能通过修改代码绕过正确做法是向厂商获取正式版安装程序重新覆盖安装。另外要注意授权是按开发机绑定的正式版的 .bpl 拿到后不要在多台机器间复制。提前确认手上是评估版还是正式版能避免项目演示到一半弹授权窗的尴尬。5.5 误用 regsvr32 注册 .bplActiveX 与 VCL 安装路径的分岔现象照着网上的教程对 IPWorks 某个 .bpl 执行 regsvr32 xxx.bpl弹窗提示“不是有效的 DLL/OCX 模块”或“DllRegisterServer 入口点未找到”。原因VCL 包的加载机制是 Delphi IDE 的 Package 体系不经过 COM 注册表。regsvr32 是 ActiveX/COM 组件用的工具。把 .bpl 当 ActiveX 注册思路从一开始就是错的。搜索“activex控件安装”能找到的教程大多假设你手里是 .dll而 Delphi 控件分发包里往往是 .bpl。解决先确认这个包是 VCL 版还是 ActiveX 版。看目录VCL 版提供 .bpl、.dcu、.dpkActiveX 版提供 .dll、.tlb 和注册说明。VCL 版用 Component Install PackagesActiveX 版才用 regsvr32 注册 .dll然后通过 Import Component 导入类型库。两类文件分开放别混在一个目录里。这个区分想清楚安装过程少走一半弯路。6. 用 IPInfo 与 IPMonitor 做网卡巡检工具验证控件安装是否彻底装完一套控件最好用一个不涉及业务的小工具验证每个控件真的可用而不是等到项目里才踩雷。我惯用的验证工程是网卡巡检器正好用到两个不常被注意的 IPWorks 控件TIPIPInfo 与 TIPIPMonitor。TIPIPInfo 负责一次性枚举本机所有网络接口读出 IP、掩码、网关、MAC。TIPIPMonitor 则可以在接口状态变化时触发事件相当于给网卡装了实时监听器。把这两个控件放到一个窗体上加上一个 TMemo就能做出一分钟内看到现象的最小验证程序// 拖入 TIPIPInfo1 和 TIPIPMonitor1Memo1 用于输出 procedure TForm1.btnEnumerateClick(Sender: TObject); var i: Integer; begin IPIPInfo1.Reset; // 重新扫描网卡避免读到旧缓存 for i : 0 to IPIPInfo1.NetworkInterfaceCount - 1 do Memo1.Lines.Add( IPIPInfo1.NetworkInterface[i].Description | IPIPInfo1.NetworkInterface[i].IPAddress); end; procedure TForm1.IPIPMonitor1StatusChange(Sender: TObject; InterfaceId: Integer; NewStatus: Integer); begin Memo1.Lines.Add(接口 InterfaceId.ToString 状态变为 NewStatus.ToString); end;这个验证工程的价值不只是确认“控件装好了”。它会逼你面对三个细节属性的索引从 0 开始枚举前需要 Reset 重新扫描才能读到最新数据事件回调里的参数格式因版本而异。能在几分钟里把这些跑顺说明路径、包、事件机制都正常后续接业务代码时就不用从零排错。我自己的教训是头几年用第三方控件喜欢一次性把一个大项目的所有单元都引入控件包结果编译报错时根本分不清是哪一层的版本问题。后来养成的习惯就是装完控件先开空白工程逐个控件冒烟测试半小时能确认的事绝不拖到项目集成阶段。这个习惯帮我省掉的排错时间比控件本身的授权费贵多了。希望这套安装与排错思路能帮到你。本文还有配套的精品资源点击获取