10

是否可以在 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),但有时我会遇到并非所有代码都可用的应用程序(是的,客户应该始终为第 3 方购买所有源代码东西,但有时他们不会)。

但是假设这是一个我没有代码的例子,或者只有接口文件(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 发现了这篇德语 EDN 文章英文谷歌翻译)。那篇文章非常准确地描述了这种格式,应该可以创建一些 Delphi 代码来解决这个问题。

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

——杰伦

4

4 回答 4

10

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

tdump -um -e dbrtl100.bpl

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

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

“$”是用来标记函数名的结束和参数类型的开始的。剩下的谜团是“qqrx”部分。Tondrej 发现的文章揭示了这一点。“qqr”表示调用约定,在这种情况下是register,也就是fastcall。“x”适用于参数,表示它是常数。

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

于 2009-10-19T21:13:29.503 回答
7

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

于 2010-02-03T21:51:08.077 回答
7

另见这篇文章(德语)。我猜这种修饰可能是向后兼容的,并且在以后的 Delphi 版本中引入了新的修饰方案以实现新的语言功能。

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

于 2009-10-19T20:50:59.607 回答