是否可以在 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:

感谢罗布·肯尼迪: tdump -e dbrtl100.bpl 就可以了。不需要 -嗯 完全:

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 代码来解决这个问题。

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

——杰罗恩

有帮助吗?

解决方案

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

tdump -um -e dbrtl100.bpl

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

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

“$”对于标记函数名称的结束和参数类型的开始是必需的。剩下的谜团就是“qqrx”部分。文章透露了这一点 托德雷吉发现. 。“qqr”表示调用约定,在本例中是 登记, ,又名 快速呼叫. 。“x”适用于参数并表示它是常数。

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

其他提示

另请参阅 本文 (在德国)。我猜想重整可能是向后兼容的,并且在更高版本的 Delphi 版本中引入了新的重整方案以实现新的语言功能。

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

来自 Delphi 2007 源文件:

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top