在Delphi XE和DataSnap中是否可以使用Indy 10.5.8.0?

8

问题

  1. 是否有安全的预设路径可用于更新Delphi XE的最新INDY版本?
  2. 如果没有,通过创建旧的公共方法并在实现部分调用新方法来修补源代码是安全的吗?
  3. 我是否遗漏了其他内容,或者真的被困在INDY 10.5.7中,直到下一个Delphi次要/主要发布?

案例

我正在尝试为我的Delphi XE(更新1)更新INDY到最新版本,因此我从indy.fulgan.com/ZIP下载了最新的INDY10文件(Indy_4545.zip)。

包编译成功,我现在甚至可以在关于框对话框中看到新版本10.5.8.0,但是在IDE重新启动后,我收到了一条消息:

在动态链接库IndyProtocols150.bpl中找不到过程@Idhttp@TIdCustomHTTP@GetRequestHeaders$qqrv的入口点。

我自由翻译成英语:

在动态链接库IndyProtocols150.bpl中未找到@ Idhttp @ TIdCustomHTTP @ GetRequestHeaders $ qqrv的过程入口点。

快速比较旧的和新的IdHTTP.pas后,我发现TIdCustomHttp类有很多更改,包括重命名一些方法:

  • GetResponseHeaders更改为GetResponse
  • GetRequestHeaders更改为GetRequest
  • SetRequestHeaders更改为SetRequest

还有其他类接口中的已更改的公共/发布方法。

更新后,我得到了许多无法加载的软件包,包括dclcxPivotGridOLAPD15.bpl,它依次依赖于dclDataSnapServer150.bpl,该bpl遇到丢失的方法。

据我所知,我无法重新编译dclDataSnapServer150.bpl(也可能是其他失败的软件包,我只停在这里)。

DataSnap和DevExpress对IDE的支持对我的日常工作至关重要,因此

4个回答

12

[安装 Delphi XE 的 Indy]

是的,安装过程很繁琐,但为了确保正确安装,这值得一做。

本文适用于所有 Indy 组件,不包括 SSL。(我还没有尝试任何 SSL 相关内容。)

A.) 删除所有随 Delphi 一起提供的 Indy 文件。这些文件已经过时,因为 Indy 项目每天都会更新,修复bug。如果Delphi读取旧文件而不是新的 Indy 库,IDE 将在各种时间产生非常难以追踪的错误。

i. 转到“组件”->“安装包”,然后完全删除所有以“Indy”开头的包。

ii. 关闭 Delphi。

iii. 在 Delphi 的 Bin 文件夹中删除匹配“dclIndy*.bpl”和“Indy *.bpl”的所有文件。
(C:\Program Files\Embarcadero\RAD Studio\8.0\bin)

iv. 在 Delphi 的 Lib 子文件夹中删除匹配“Indy*.dcu”和“Id*.dcu”^^^ 的所有文件。
(C:\Program Files\Embarcadero\RAD Studio\8.0\lib\win32\debug)
(C:\Program Files\Embarcadero\RAD Studio\8.0\lib\win32\release)
^^^ 注意:要小心那些以字母“id”开头的非 Indy DCUs,例如“idispids.dcu”和“idoc.dcu”。

v. 删除整个 Indy10 源文件夹:
(C:\Program Files\Embarcadero\RAD Studio\8.0\source\Indy10)

B.)http://indy.fulgan.com/ZIP/下载最新的 Indy10_XXXX.zip。(如果在任何步骤中使用此 zip 文件出现编译错误或运行时错误,请尝试其他版本。)

如果下载ZIP文件时遇到问题,请不要气馁!在接下来的一天重新下载ZIP文件并尝试。

C.) 将系统、核心和协议文件夹提取到您自己的Indy库文件夹中,例如:
(c:\MyDelphiComponents\Indy\Core)
(c:\MyDelphiComponents\Indy\System)
(c:\MyDelphiComponents\Indy\Protocols)

D.) 启动Delphi。忽略所有失败的包对话框:这些是依赖Indy的Embarcadero包!(只需单击所有错误上的确定,并指示任何失败的包不应再次加载。)

E.) 转到"选项-->环境选项-->Delphi选项-->浏览路径",删除以$(BDS)\Lib\Indy10开头的路径。

F.) 转到"选项-->环境选项-->Delphi选项-->库路径",将步骤C中的新系统、核心和协议文件夹添加到Delphi的库路径中。

G.) 按顺序执行以下5个操作: (对于任何关于升级项目的对话框,只需单击"确定"即可。)


重要提示:

在加载每个dpk之后和每次构建之前,请执行以下操作:

项目-->选项-->描述-->构建控制

将单选按钮设置为"显式重建"。

(实际上,这是可选的,但我总是使软件包显式重建,因为它们似乎更容易处理,但我想听听其他人对此的看法...)


  1. 构建- System\IndySystem150.dpk
  2. 构建- Core\IndyCore150.dpk
  3. 首先构建,然后安装- Core\dclIndyCore150.dpk
  4. 构建- Protocols\IndyProtocols150.dpk
  5. 首先构建,然后安装- Protocols\dclIndyProtocols150.dpk
然后安装Protocols\dclIndyProtocols150.dpk

** 确认你已经在所有包上设置了“显式重建”! **

H.) 最后,进入 Component-->Install Packages 并找到所有依赖于 Indy 的包,这些包在步骤 D 中被关闭。重新激活它们,并重新启动 Delphi。 (如果您的新 Indy 与 Delphi 发布的版本没有太大变化,那么这些包将使用新的 Indy!)

++ 注意,重新激活这些 Embarcadero 包时可能不会立即收到任何错误,但它们可能会在以后的随机时间出现。例如,我刚刚安装了 Indy10_4548.zip,所有重新激活的包都看起来很好。然后一天后,IDE 抛出了一条消息,说它找不到 TIdCustomHTTP 中的 GetRequestHeaders,导致 dclWindowsAzureManagement150.bpl 出现问题。因此,我不得不返回 IDE 并禁用 Windows Azure 包。


感谢您的回答。我的问题只涉及到您最后提到的部分,而不是安装新Indy本身的过程。但正如我在问题中所说,必须安装dclDataSnapServer150,因为我的项目依赖于DataSnap。因此,您所写的内容最终与我的问题相同,而不是对我的问题的回答。 - jachguate
DataSnap使用Indy,但由于DataSnap无法重新编译,因此它只能使用随IDE一起提供的Indy版本。对于任何使用DataSnap的项目,您都必须维护原始的Indy包。由于IDE允许您按项目启用/禁用包,因此您可以为DataSnap项目使用原始的Indy包,而为其他项目使用更新的Indy包。只需将包安装到不同的文件夹中即可。 - Remy Lebeau

7
据我所知,您将失去一些与Delphi部署的Indy版本强烈相关的软件包,尤其是新的Datasnap。您可以尝试构建自己的软件包来代替无法重新编译的标准软件包,只要所有所需的单元都可用。在我看来,Embarcadero应该找到一个解决方案,使其代码不依赖于像Indy这样“不稳定”的库。这在专业环境中是不可接受的,特别是因为他们无法发布包括Indy bug修复在内的官方更新超过几个月。例如,我最近发现Indy 10.5.5邮件消息解析截断了邮件地址,在10.5.8中没有发生这种情况。当然,10.5.5的行为是不可接受的,我被迫升级...

你看到的错误是因为其他包(如Datasnap)依赖于产品附带的indy包。如果您想更改Indy的版本,则必须卸载一些依赖它们的其他软件包。从BPL文件夹中删除旧的IndyProtocols150.bpl,查看还有哪些内容无法加载,并在再次尝试之前卸载所有受影响的软件包。 - Warren P
2
卸载依赖包,例如dclDataSnapServer对我来说看起来很糟糕,因为我在当前项目中使用了DataSnap。更好的解决方案是为每个Indy breaking release提供新的兼容版本,或者提供向后兼容的Indy minor releases。当然,这些都不在我们的掌握之中...也许我应该通过Embarcadero支持来解决这个问题。 - jachguate
4
真正的问题是Indy不应该在一个版本中进行重大变更。我认为Indy真的缺乏适当的发布管理,Embarcadero应该控制它,因为其自身代码的依赖关系。重大变更可以在主要版本中进行,但次要版本只应添加不需要更改实际接口的修复或功能。否则,他们会让任何试图使用Indy构建库的开发人员发疯(即EldoS SecureBlackBox与Indy存在相同的问题)。也许Embarcadero应该分叉Indy并对其进行处理。 - user160694
1
Indy团队非常清楚其在Indy当前实践方面的局限性和不足之处。当我们开始着手Indy 11时,我们希望在编码和管理方面进行大量改进。简化安装和升级问题是待办事项清单中的重要任务。 - Remy Lebeau
我希望能够轻松地替换工厂Indy包,并用其他包替换它们。也许需要一个好的Indy安装程序,可以将indy替换为本地构建,然后再将其替换回来。我同意ldsandon的观点。我认为DataSnap对Indy的依赖会在IDE当前限制下造成严重问题,Indy项目团队无法真正解决这个问题。他们的API必须被冻结,并且必须完全保持ABI兼容性,否则DataSnap包就会出现问题。痛苦啊。 - Warren P

4

根据他人的回答和Remy的评论:

在Delphi XE Update 1中安装Indy 10.5.8.0会破坏DataSnap,这是不可能的。


3
可以,只需保留IDE附带的原始包的副本,或安装更新后的Indy的单独副本。然后调整项目设置,使DataSnap项目使用原始包,并使其他项目使用更新后的包。 - Remy Lebeau
@Remy:你说的很准确,我的99%相关项目都在使用DataSnap,所以拥有一个更新的INDY玩具是不错的,但更好的是能够拥有对于实际问题更有用的东西。 - jachguate
1
我收到 Embarcadero 的通知,他们将来会研究使 DataSnap 能够升级 Indy 而不再出现兼容性问题的可能性。 - Remy Lebeau
@Remy:好知道!我会关注并等待那一刻。我必须说我喜欢INDY正在积极开发的事实,我只希望这种演变是隔离的和/或考虑到直接Delphi依赖项,至少在下一个库主要发布之前进行所需的重大更改。无论如何,我别无选择,只能感激INDY团队所做的工作。 - jachguate
3
也许为INDY项目制作一个漂亮的JVCL风格的安装程序,并能备份原始的INDY,以及提供一个干净地注册/注销所有内容的交换工具,会是个不错的主意。 - Warren P

2
尽管我自己不使用 Delphi XE,而是使用 2010 版本。但在这个 Stack Overflow 帖子的帮助下:逐步升级 Delphi 2009 中的 Indy 10,我能够将 Indy 组件升级到最新版本。虽然这个问题是针对 2009 版本的(但答案也涵盖了 2010 版本),但在我的 2010 版本中也起作用,所以我认为它也会对您有帮助。我建议您阅读评论,因为那里也有一些很好的提示。希望这有所帮助。

谢谢,我不知道那个问题,但是我按照自己的步骤(并尝试为我的博客写一篇关于升级的文章)。正如所说,问题不在于编译/安装,而是因为接口发生了变化,其他软件包依赖于旧版本。还是谢谢你的回答。 - jachguate
当我升级Indy时,我不得不手动编辑项目文件以利用新版本的Indy。这可能有点麻烦,如果忘记了可能会导致错误。 - Tommy Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接