【问题标题】:Delphi - unmangle names in BPL'sDelphi - 解开 BPL 中的名称
【发布时间】:2010-12-08 03:24:21
【问题描述】:

是否可以在 Delphi 中解开这些名称? 如果是这样,我从哪里获得更多信息?

在 dbrtl100.bpl 中找不到特定条目的错误消息示例 我想知道它找不到哪个确切的函数(单位、类、名称、参数等)。

---------------------------
myApp.exe - Entry Point Not Found
---------------------------
The procedure entry point @Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl. 
---------------------------
OK   
---------------------------

我知道这是 Dbcommon 单元中的 GetTableNameFromSQLEx 方法(我有带有 RTL/VCL 源的 Delphi),但有时我会遇到并非所有代码都可用的应用程序(是的,客户应该始终购买所有源代码对于 3rd 方的东西,但有时他们不会)。

但是说这是一个我没有代码的示例,或者只有接口文件(BDE.INT 有人吗?) 它有哪些参数(即潜在的过载)? 它有什么返回类型?

这对于任何 Delphi 版本是否都一样?

--杰罗恩

编辑 1

感谢 Rob Kennedy:tdump -e dbrtl100.bpl 成功了。根本不需要-um

C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)

编辑 2

感谢 TOndrej 发现了这个German EDN article (English Google Translation)。 那篇文章非常准确地描述了这种格式,应该可以创建一些 Delphi 代码来解决这个问题。

可惜作者提到的网站(和电子邮件)现在已经死了,但很高兴知道这个信息。

--杰罗恩

【问题讨论】:

    标签: delphi name-mangling bpl


    【解决方案1】:

    Delphi 没有提供可以解开函数名称的函数,而且我不知道它在任何地方都有记录。 Delphi in a Nutshell 提到“tdump”实用程序有一个 -um 开关,可以让它解开它找到的符号。没试过。

    tdump -um -e dbrtl100.bpl

    如果这不起作用,那么解开自己看起来并不是一个非常复杂的方案。显然,名称以“@”开头,后面是单元名称和函数名称,由另一个“@”符号分隔。该函数名称后跟“$qqrx”,然后是参数类型。

    参数类型使用类型名称的字符数进行编码,后跟与之前相同的“@”分隔格式。

    “$”是函数名结束和参数类型开始所必需的。剩下的谜团是“qqrx”部分。文章Tondrej found 揭示了这一点。 “qqr”表示调用约定,在本例中为 register,也称为 fastcall。 “x”适用于参数,表示它是常数。

    返回类型不需要编码在损坏的函数名中,因为重载无论如何都不会考虑返回类型。

    【讨论】:

    • 谢谢 - 这有帮助。实际上,根本不需要 -um 。这只是工作: C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx 文件标准输入:00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)
    • 我认为这是最近的增强。我很确定 tdump 并不总是这样做。
    【解决方案2】:

    另见this article(德语)。 我猜 mangling 可能是向后兼容的,并且在以后的 Delphi 版本中引入了新的 mangling 方案以提供新的语言功能。

    【讨论】:

    • 谢谢。我读德语,所以没问题。现在我想接受两个答案:-)
    【解决方案3】:

    如果您有 C++Builder,请查看 $(BDS)\source\cpprtl\Source\misc\unmangle.c - 它包含 TDUMP、调试器和链接器使用的拆解机制的源代码。 (C++Builder 和 Delphi 使用相同的修饰方案。)

    【讨论】:

    • 太棒了!从什么时候开始介绍的?我似乎只有它们的 2009 和 2010 版本: D2009-Enterprise\source\cpprtl\Source\misc\unmangle.c D2010-Enterprise\source\cpprtl\Source\misc\unmangle.c 很好的阅读材料 :-)
    • 我认为这与密件抄送本身一样长。然而,该文件在旧版本中被称为 um.c 而不是 unmangle.c。
    【解决方案4】:

    来自 Delphi 2007 源文件:

    function GetTableNameFromSQLEx(const SQL: WideString; IdOption: IDENTIFIEROption): WideString;
    

    这似乎是相同的版本,因为我的 Windows\System32 文件夹中也有相同的 .BPL。

    可以在 [Program Files 文件夹]\CodeGear\RAD Studio\5.0\source\Win32\db 中找到源代码

    Borland/Codegear/Embarcadero 已经使用这种编码有一段时间了,但从未提供过有关 .BPL 格式的很多细节。因为我讨厌在我的项目中使用运行时库,所以我从来没有对它们很感兴趣。我更喜欢将它们编译到我的项目中,尽管这会产生更大的可执行文件。

    【讨论】:

    • 其实我知道是哪一个:Delphi 2007 update 3,DBCommon。这更适用于您没有来源或需要寻找来源的 BPL。我重新表述了我的问题。很抱歉给您带来不便:-)
    猜你喜欢
    • 2011-11-09
    • 2012-08-07
    • 2017-07-11
    • 2014-10-17
    • 1970-01-01
    • 2011-01-09
    • 2014-05-12
    • 2018-04-20
    • 2020-03-17
    相关资源
    最近更新 更多