Delphi - BPL中的unmangle名称

时间:2009-10-19 20:42:40

标签: delphi name-mangling bpl

是否有可能在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方法(我有Delphi的RTL / VCL源代码),但有时我会遇到并非所有代码都可用的应用程序(是的,客户应该总是购买所有源代码)对于第三方的东西,但有时他们不这样做。

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

对于任何Delphi版本,这种错误是否相同?

- 的Jeroen

编辑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 articleEnglish Google Translation)。 那篇文章非常准确地描述了格式,应该可以创建一些Delphi代码来解决这个问题。

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

- 的Jeroen

4 个答案:

答案 0 :(得分:8)

Delphi没有提供功能名称的功能,我不知道它在任何地方都有记录。 Delphi in a Nutshell提到“tdump”实用程序有一个 -um 开关,可以使它找到非符号的符号。我从未尝试过。

tdump -um -e dbrtl100.bpl

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

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

标记函数名称的结尾和参数类型的开头需要“$”。剩下的谜团是“qqrx”部分。这篇文章Tondrej found揭示了这一点。 “qqr”表示调用约定,在本例中是 register ,a.k.a。 fastcall 。 “x”适用于参数,意味着它是常量。

返回类型不需要在受损函数名中编码,因为重载不会考虑返回类型。

答案 1 :(得分:7)

另见this article(德文版)。 我想这次修改可能是向后兼容的,并且在后来的Delphi版本中引入了新的修改方案以用于新的语言功能。

答案 2 :(得分:7)

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

答案 3 :(得分:0)

来自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格式的细节。我从来没有对它们很感兴趣,因为我讨厌在我的项目中使用运行时库。我更喜欢将它们编译到我的项目中,尽管这会产生更大的可执行文件。