资讯动态

Delphi 12 安装 Indy 10.6.3.3:编译配置与排错

发布时间:2026/10/24 3:18:06 来源:尧图企业网站定制
简介IndyInternet Direct10.6.3.3 是面向 Delphi 与 CBuilder 开发者的开源网络组件库完整源码包适合需要构建邮件客户端、Web 服务、FTP 工具或自定义 TCP/UDP 通信程序的中高级开发者。它把 HTTP、SMTP、POP3、FTP 等常用协议封装为可拖放控件既能缩短网络模块的开发周期也便于按项目需求修改和扩展底层实现。压缩包共 2000 个文件约 9.67MB以 327 个 pas 源码、137 个 dpk 组件包、315 个 bmp 位图、116 个 rc 资源脚本、111 个 res 资源及 509 个 txt 文档为主同时包含 dproj、dfm、inc 等工程与表单文件覆盖组件源码、资源、示例和构建配置目录结构较完整。现有 362 人学习说明其在 Delphi 网络开发社区中具有一定参考价值。读者可从中获得可编译的 Indy 组件源码、协议实现细节和跨版本工程配置样本也可借助示例与文档理解 TIdTCPClient、TIdHTTP 等组件的属性设置、事件处理与异步通信思路为排查连接、收发和资源编译问题提供直接依据。1. 从一次「装完 IDE 起不来」说起Delphi 12 为什么还要单独装 Indy 10.6.3.3去年帮一个做工业上位机的团队换机器Delphi 12 装好项目一打开IdHTTP那一行直接标红编译报找不到单元。他们的第一反应是「IDE 装坏了」重装了两遍 Delphi 12问题原样不动。真正的原因很朴素IDE 自带的那套 Indy 版本太老而项目里用到了IdSSLIOHandlerSocketOpenSSL的新属性两边对不上。这类事在 Delphi 圈子里几乎是玄学级别的常见——Indy 是随 IDE 一起发的基础组件很多人以为它天然就在直到某天升级了 Delphi 大版本、或者从旧机器迁移工程才发现组件面板上的 Indy 页是灰的或者一编译就冒出一串单位未找到。装不好会怎样轻则组件面板里没有 Indy 页重则 IDE 启动时弹「Cannot load package」整个开发环境卡在欢迎界面进不去。这篇记录就是给正在 Delphi 12 上折腾 Indy 10.6.3.3 的人看的版本怎么对、五个包按什么顺序编译、库路径写在哪、装崩了怎么退回上一个能用状态。新手照着走能跑通熟手可以重点看第 4、5 章里那几个参数取舍。2. 装前把环境列清Delphi 12 与 Indy 10.6.3.3 的版本对照动手之前先把版本关系理清楚这一步省掉后面十有八九是白编译一遍。Indy 的源码包是按编译器版本分包的包名里的数字后缀不是随便起的它必须和你的 Delphi 编译器版本严格对应。你在 Delphi 12 里打开一个IndySystem280.dpkIDE 不会给你任何友好提示只会丢一句读不懂的编译错误让人以为包本身坏了。2.1 包后缀对上编译才不会白干Indy 10.6.x 这一支的包名规则是IndySystem/IndyCore/IndyProtocols加三位数字后缀设计期包再加dcl前缀。这个后缀就是 Delphi 的编译器版本代号对不上就是编不过。Delphi 版本产品版本号编译器版本包后缀对应包名示例Delphi 10.4 Sydney21.034.0270IndySystem270.dpkDelphi 11 Alexandria22.035.0280IndySystem280.dpkDelphi 12 Athens23.036.0290IndySystem290.dpk我一般拿到压缩包的第一件事不是解压是先看Lib\System目录下有没有IndySystem290.dpk。有说明这份包是给 Delphi 12 准备的只有 280 或者 270那要么是拿错了版本要么得自己改包名和requires子句——改包名这事我不推荐requires里引用的rtl、vcl这些运行期包版本号也得跟着改改漏一个就是连锁报错。提示Delphi 12 的编译器版本是 36.0包后缀 290。这两个数字记不住没关系打开 IDE 的「帮助 - 关于」能看到产品版本 23.0对应关系查上表就行。还有一个容易忽略的点Indy 10.6.3.3 这一版开始对 OpenSSL 3.x 的支持比较完整了。如果你的项目里有 HTTPS 请求装完包只是第一步动态库那一关在第 4 章还会单独说。2.2 目录结构与编译顺序先 System 再 Core 后 Protocols解压出来Lib目录下通常是三个子目录System、Core、Protocols。别被这三个名字唬住它们之间是严格的下层依赖关系编译顺序错了IDE 会告诉你「找不到必需的包」。依赖链条是这样的IndySystem是最底层放的是IdGlobal、IdException、IdStack这类基础单元IndyCore依赖IndySystem装的是 TCP、UDP、线程池这些核心实现IndyProtocols依赖IndyCoreIdHTTP、IdFTP、IdSMTP全在这一层。设计期包dclIndyCore和dclIndyProtocols则是把组件注册到 IDE 面板上的那一层它们又依赖前面三个运行期包编出来的.bpl。目录文件类型依赖Lib\SystemIndySystem290.dpk运行期包rtlLib\CoreIndyCore290.dpk运行期包IndySystem290Lib\ProtocolsIndyProtocols290.dpk运行期包IndyCore290Lib\CoredclIndyCore290.dpk设计期包IndyCore290Lib\ProtocolsdclIndyProtocols290.dpk设计期包IndyProtocols290所以顺序只能是System → Core → Protocols → dclIndyCore → dclIndyProtocols。中间任何一步失败后面全部不用试。我见过有人图省事直接打开dclIndyProtocols290.dpk点 InstallIDE 报「找不到 IndyProtocols290.bpl」然后就开始怀疑包损坏——其实只是跳步了。注意如果你手上这份包的目录结构和上面不完全一样有些整理过的版本会把设计期包单独放在Lib\Design之类的位置以实际文件所在目录为准但依赖顺序是固定的不随目录变化。3. 动手编译五个包按顺序走完环境理清之后进入正题。这一章的操作全部在 IDE 里完成不需要额外装工具链。如果你要在构建机上批量编译3.2 节末尾也给了dcc32的命令行写法但第一次装强烈建议先用 IDE 走一遍报错信息看得清楚。3.1 先把 IDE 自带的 Indy 卸干净Delphi 12 安装时是自带一套 Indy 的虽然版本旧但设计期包已经注册进 IDE 了。你如果不卸直接装新的结果通常是两份.bpl抢同一批组件类名IDE 启动时报Cannot load package然后整个环境打不开。这个坑我在第 5 章还会展开说这里先把动作做掉。打开 IDE走Component→Install Packages在列表里找Indy Core Design Package和Indy Protocols Design Package这两项把勾去掉。注意是去勾不是删文件——文件先留着第 5 章会讲怎么用它当后悔药。去勾之后列表里应该还能看到IndySystem290.bpl之类的运行期包那些不用管运行期包不影响组件注册。确认设计期包都取消勾选后点 OKIDE 会提示需要重启先别急着重启继续往下做等五个包全部编完再一起重启。顺手还要做一件事把项目里的 Indy 相关搜索路径先清掉。如果你之前手动往Library Path里加过旧版 Indy 的源码路径现在不删后面编译时会优先命中旧单元表现是「明明装了新版IdHTTP还是没有新属性」。路径在Tools→Options→Language→Delphi→Library里Library path一栏里凡是带Indy的条目全部删掉先清空再重建比一条条改省事。3.2 编译三个运行期包先编IndySystem290.dpk。在 IDE 里File→Open文件类型选Delphi Package (*.dpk)定位到Lib\System\IndySystem290.dpk。打开后不要急着点 Install运行期包只 Build 不 Install——Install 是给设计期包用的动作运行期包 Install 了也不会往组件面板上加东西反而会把.bpl塞进 IDE 的包列表后面卸载更麻烦。点Project→Build IndySystem290。编译目标平台先选 Win32这是最稳的一条路。编译成功后输出目录里会出现IndySystem290.bpl和IndySystem290.dcp。默认输出目录一般是包所在的目录我习惯统一改到一个固定位置第 4.1 节会说怎么改。接着编IndyCore290.dpk同样只 Build。这一步如果报Required package IndySystem290 not found说明上一个包的输出路径不在 IDE 的搜索范围里回到 4.1 节先把输出目录统一了再回来。然后是IndyProtocols290.dpk也是只 Build。三个运行期包编完Bpl目录下应该有三个.bpl和三个.dcp。如果你要在没有 IDE 的构建机上做同样的事用dcc32直接编命令大致是这样cd /d D:\Indy10\Lib\System %BDS%\bin\dcc32.exe -B -E..\..\Bpl -NU..\..\Dcp IndySystem290.dpk-B是全量重建避免复用上一次的.dcu导致改了源码不生效-E指定.bpl的输出目录-NU指定.dcp的输出目录。%BDS%是 Delphi 安装后写入的环境变量指向 IDE 根目录如果你机器上没有这个变量换成实际安装路径即可。三个包依次跑Core 和 Protocols 的命令只有文件名不同。提示dcc32编译.dpk时如果报找不到某个单元多半是当前目录不对。.dpk里的contains子句用的是相对路径必须在包所在目录执行切目录这一步不能省。3.3 安装两个设计期包并确认注册运行期包编完轮到设计期包。打开dclIndyCore290.dpk这次点Project→Install。IDE 会把dclIndyCore290.bpl加载进去同时在Install Packages列表里新增一项并自动勾选。装完这一步组件面板上应该出现Indy Core页里面有IdTCPClient、IdTCPserver这些。再打开dclIndyProtocols290.dpk同样 Install。这一步会带上IdHTTP、IdFTP、IdSMTP、IdPOP3这一大批组件面板上出现Indy Clients、Indy Servers、Indy Misc几个页签。两个设计期包都装完之后重启 IDE。重启后做三件事确认第一Component→Install Packages里Indy Core Design Package和Indy Protocols Design Package两项在列表里且是勾选状态包名后面显示的路径指向你刚才编译输出的位置不是 IDE 安装目录。第二组件面板上能找到Indy Clients页里面IdHTTP图标不是灰色。第三新建一个空的 VCL 程序uses里手写IdHTTP按CtrlF12能不能跳到IdHTTP.pas源码。能跳说明搜索路径通了跳不过去只跳到.dcu说明路径顺序有问题回到 4.2 节调。注意Win64 平台需要单独再编一遍。三个运行期包在 IDE 里把 Target Platforms 切到 Win64 后重新 Build设计期包不用重装——设计期包只在 IDE 里跑IDE 本身是 32 位的。项目编译 Win64 时用的是 Win64 版的.dcp少了这一步64 位项目会报找不到单元。4. 配置库路径、输出目录和 OpenSSL 三处不能含糊包编完、装上很多人以为结束了结果一建项目就翻车。这一章讲的三处配置是我装过十几台机器之后总结出来最容易出问题的三个点每一个都能单独导致「装完了但用不了」。4.1 输出目录统一别让 bpl 撒得到处都是默认情况下.dpk的编译输出目录是包文件所在目录。三个运行期包在三个不同子目录里编完之后.bpl就分散在Lib\System、Lib\Core、Lib\Protocols三处。这在单机上还能凑合一旦你要把这套环境复制到第二台机器或者要写进构建脚本路径就彻底乱了。我一般会先在 Indy 根目录下建两个空目录Bpl和Dcp。然后在每个包的Project→Options→Delphi Compiler里把Output directory设成..\..\BplUnit output directory设成..\..\Dcp。三个运行期包和两个设计期包都要设一遍五个包五遍别嫌烦。设置完之后再重新 Build 一遍三个运行期包输出全部落到Bpl和Dcp下。设计期包 Install 的时候IDE 会自己去Bpl目录找依赖的运行期包因为.bpl的搜索路径里包含了输出目录。路径设错的表现很有辨识度Install 设计期包时报Cannot find IndyCore290.bpl但你明明看到Lib\Core下有这个文件。原因就是 IDE 去Bpl目录找而那个目录是空的。解决办法要么把输出目录改对要么在Tools→Options→Environment Options→Delphi Options→Library的Browsing path里把三个子目录都加进去。两条路我选前者路径干净。4.2 Library Path 与搜索顺序源码必须排在本体前面这是最容易翻车、也最难自查的一处。Delphi 12 的 IDE 自带 Indy 的.dcu位置在$(BDSLIB)\$(Platform)\release下面。你把 Indy 10.6.3.3 的源码路径加到Library Path之后编译器找IdHTTP的时候是按下拉列表顺序挨个搜的如果自带.dcu所在的目录排在源码路径前面编译器会直接命中那个旧.dcu不编译你的新源码。结果就是包装好了组件面板也有项目也能编译但代码里IdHTTP的新属性一个都点不出来Ctrl点击跳进去看到的是旧版源码。这个现象很像「装了假的」其实是搜索顺序问题。正确的做法是把三个源码目录加到Library Path的最前面; Tools Options Language Delphi Library Library path顺序从上到下 D:\Indy10\Lib\System D:\Indy10\Lib\Core D:\Indy10\Lib\Protocols D:\Indy10\Bpl D:\Indy10\Dcp $(BDSLIB)\$(Platform)\release前五行是手动加的最后一行是原来就有的保持它在后面。Bpl和Dcp两个目录也要加进去否则编译项目时链接阶段找不到.dcp报Required package IndyCore290 not found。如果你有多个平台要编Library path这里有个坑Delphi 12 的Library path是分平台配置的你在 Win32 下加完切到 Win64 还得再加一遍。这也是为什么很多人 32 位项目编得好好的一切 64 位就报找不到单元。提示改完路径不用重装包但必须重启 IDE 才生效。Library path是启动时读进内存的点 OK 之后不重启编译行为还是旧的。4.3 OpenSSL 3 的 dll 放哪、版本怎么挑Indy 本身不带 SSL 实现IdSSLIOHandlerSocketOpenSSL是去加载系统的动态库。10.6.3.3 这一版对 OpenSSL 3.x 的支持是完整的加载时会依次尝试libssl-3.dll/libcrypto-3.dll找不到再退回libssl-1_1.dll/libcrypto-1_1.dll。版本选择上我一般按项目现状来场景建议库版本文件名说明新项目只跑 Win64OpenSSL 3.xlibssl-3.dll、libcrypto-3.dll与 10.6.3.3 匹配度最好老项目还要兼容 Win32OpenSSL 1.1.1libssl-1_1.dll、libcrypto-1_1.dll老代码里的SSLVersions设置不用改两端都要两套都放四个文件同目录Indy 自动按版本回退放的位置只有一个原则必须是进程能找到的地方。开发期最简单的是直接扔在.exe同目录部署的时候也照这个规则走不会出错。别放System32——那需要管理员权限而且多版本共存时容易互相覆盖属于自找麻烦。放好之后IdSSLIOHandlerSocketOpenSSL组件的SSLOptions.Method设成sslvTLSv1_2SSLOptions.Mode设成sslmClient这是目前兼容性最稳的一组配置。Method别设成sslvSSLv23那是个看起来「自动协商」实则在新版 OpenSSL 上行为不一致的选项踩过不止一次。5. 排查Indy 10.6.3.3 装完最常见的五个翻车点这一章的每一条都是我在不同机器上真实撞过的按「现象 → 原因 → 解决」记遇到时对号入座就行。5.1 IDE 启动弹「Cannot load package dclIndyCore290」现象装完重启 IDE欢迎界面还没出来就弹窗说某个包加载失败点确定后 IDE 能进但组件面板上的 Indy 页整个不见了。原因IDE 里同时注册了两份设计期包一份是自带的旧版一份是新装的 290。两个包的.bpl里注册了同名组件类加载第二个时冲突。也可能是 3.1 节卸载时只去了勾、没重启就直接装新的旧包还在内存里。解决关掉 IDE用regedit找到HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0\Known Packages把里面所有带Indy的项删掉然后重启 IDE重新走 3.3 节的 Install。删注册表之前先导出备份这算基本操作。5.2 编译项目报「Unit IdHTTP not found」现象包装好了组件面板也有新建项目拖一个IdHTTP上去能编译但uses里手写IdHTTP就报找不到单元。原因组件拖上来的单元引用是 IDE 自动补的走的是包的注册路径手写uses走的是Library path搜索两个路径不是一回事。多半是 4.2 节的路径顺序没配对或者路径加在了 Win32 下、项目编的是 Win64。解决对着 4.2 节把三个源码目录加到当前平台的Library path最前面重启 IDE。验证方法是在uses里写IdHTTP按住Ctrl点进去看打开的是不是你解压目录下的.pas。5.3 装完 Indy 后原来能跑的项目开始报重复单元现象项目原来用自带 Indy 跑得好好的装完 10.6.3.3 之后编译报Unit IdGlobal is compiled with a different version of ...或者一堆重复定义的符号。原因项目目录下残留了旧版编译出来的.dcu或者$(BDSLIB)\$(Platform)\release里的旧.dcu被优先命中和新源码的头对不上。解决先把项目目录下的.dcu全删*.dcu和*.local都删再Project→Build All。还不行就检查 4.2 节的路径顺序把源码路径提到$(BDSLIB)前面。这个坑在从 Delphi 11 升级上来的项目里特别常见。5.4 HTTPS 请求报「Could not load SSL library」现象IdHTTP.Get一个 https 地址抛EIdOSSLCouldNotLoadSSLLibrary提示找不到 SSL 库。原因三种可能。一是动态库没放二是放的位置不是进程目录三是位数不对——Win32 进程加载 32 位库Win64 进程加载 64 位库混了就报这个错。解决先确认.exe同目录下有libssl-3.dll和libcrypto-3.dll。然后用dumpbin /headers看一眼 DLL 是 32 位还是 64 位和项目平台对上。最后确认IdSSLIOHandlerSocketOpenSSL的SSLOptions.Method不是sslvSSLv23。5.5 Win64 编译通过运行时报「找不到 IndyCore290.bpl」现象Win64 项目编译没问题双击运行弹窗说找不到某个.bpl。原因Delphi 的包机制下运行期包默认是动态链接的.exe启动时会去搜索.bpl。你在 IDE 里跑IDE 的PATH里有Bpl目录所以正常直接双击.exe系统PATH里没有就找不到了。解决两个选择。要么把Bpl目录加进系统PATH要么在项目选项里把Link with runtime packages的勾去掉改成静态链接。我一般选后者部署时少一个目录依赖代价是.exe大一点——上位机项目里这点体积不算事。6. 装完怎么验证一个最小 IdHTTP 程序把 HTTPS 跑通装完包、配完路径最后一步必须跑一个真实请求不然前面所有步骤都只是「看起来成功了」。我用的验证程序很小一个TForm三个控件二十行代码。procedure TForm1.Button1Click(Sender: TObject); var Http: TIdHTTP; SSL: TIdSSLIOHandlerSocketOpenSSL; Resp: string; begin Http : TIdHTTP.Create(nil); SSL : TIdSSLIOHandlerSocketOpenSSL.Create(nil); try // 连接超时 10 秒读超时 30 秒避免网络不通时界面假死 Http.ConnectTimeout : 10000; Http.ReadTimeout : 30000; // 关键把 SSL 处理器挂到 IOHandler 上否则 https 走不通 SSL.SSLOptions.Method : sslvTLSv1_2; SSL.SSLOptions.Mode : sslmClient; Http.IOHandler : SSL; // 目标地址换成你自己的测试接口返回内容写 Memo 里看 Resp : Http.Get(https://你的测试地址/); Memo1.Lines.Text : Resp; finally Http.Free; SSL.Free; end; end;这段代码的作用是验证三件事同时成立单元能找到、运行时包能加载、SSL 库能联网。ConnectTimeout和ReadTimeout必须显式设Indy 的默认值是 0在网络不通的场景下会一直挂着界面上看起来就是卡死很多人误判成组件装坏了。IOHandler这一行是最容易漏的不挂 SSL 处理器去请求 https抛出来的异常信息很模糊看不出是配置问题。跑通之后再补一个反向验证把.exe从 IDE 里拿出来单独双击运行。这一步能暴露 5.5 节说的运行时包搜索问题。如果单独运行也能通这套环境才算真正可用。最后列一张自查表出问题时按顺序过一遍检查项正确状态对应章节包后缀2902.1设计期包状态两项勾选路径指向 Bpl 目录3.3Library path 顺序源码三目录在 $(BDSLIB) 之前4.2SSL 库位数与项目平台一致5.4独立运行脱离 IDE 双击可启动5.5从那以后我每次装完 Indy 都会强制走一遍这个最小程序不光在 IDE 里跑还要把.exe拷到桌面单独双击一次。吃过一次「IDE 里好好的、交付到现场开机就弹窗」的亏之后这个习惯就再没断过。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑