德尔福 - 在BPL的unmangle名(Delphi - unmangle names in BP

2019-08-21 02:15发布

是否有可能像unmangle这些在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   
---------------------------

我知道这是方法GetTableNameFromSQLEx在Dbcommon单元(我有德尔福与RTL / VCL源),但有时我碰到的应用程序不是所有代码都可以(是的,客户应该总是购买所有的第三方的源代码的东西,但有时他们不这样做)。

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

这是重整同为任何Delphi的版本?

--jeroen

编辑1:

感谢罗布肯尼迪: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代码unmangle这一点。

皮蒂该网站的作者提到(和电子邮件)都已经死了,但好知道这个信息。

--jeroen

Answer 1:

没有配备德尔福将unmangle函数名功能,我不知道它被记录任何地方。 德尔福果壳中的提到的“TDUMP”实用程序有一个-um开关,使其找到unmangle符号。 我从来没有尝试过。

tdump -um -e dbrtl100.bpl

如果还是不行,那么它看起来并不像一个非常复杂的方案unmangle自己。 显然,名称以“@”开始,后面跟着由所述单元的名称和功能名,由另一个“@”符号分离。 这个函数的名称后面加上“$ qqrx”,然后在参数类型。

参数类型使用的类型名称后面相同的“@”的字符数编码 - 从之前分隔的格式。

在“$”是必要的,以纪念函数名的结束和参数类型的开始。 其余的奥秘是“qqrx”的一部分。 这就是文章透露Tondrej发现 。 该“qqr”表示调用约定,在这种情况下是注册 ,又名快速调用 。 的“X”适用于参数,意味着它是恒定的。

返回类型并不需要在错位的功能名称进行编码,因为超载不考虑返回类型反正。



Answer 2:

另请参阅这篇文章 (德文)。 我猜是混淆可能是向后兼容的,并且新的mangling方案将在后面的Delphi版本的新的语言功能介绍。



Answer 3:

如果你有C ++ Builder中,检查出$(BDS)\源\ cpprtl \来源\杂项\ unmangle.c - 它包含了通过TDUMP,调试器和链接器使用的unmangling机制的源代码。 (C ++ Builder和Delphi使用相同的重整方案)。



Answer 4:

从2007年德尔福源文件:

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

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

来源可以在[Program Files文件夹] \的CodeGear \ RAD Studio在\ 5.0 \源\ WIN32 \ DB找到

Borland公司/ CodeGear的/ Embarcadero公司现在已经使用这种编码了一段时间,没有给有关.BPL格式的许多细节。 因为我讨厌使用运行时库在我的项目,我从来没有在他们非常感兴趣。 我喜欢它们编成我的项目,尽管这将导致更大的可执行文件。



文章来源: Delphi - unmangle names in BPL's