2009-10-19 105 views
7

在Delphi中可以使用这些名称来取消名称吗? 如果是这样,我可以从哪里获得更多信息?Delphi - BPL中的unmangle名称

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

--------------------------- 
myApp.exe - Entry Point Not Found 
--------------------------- 
The procedure entry point @[email protected][email protected]@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl. 
--------------------------- 
OK 
--------------------------- 

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

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

这对任何德尔福版本都是一样的吗?

--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谁发现这个German EDN articleEnglish Google Translation)。 该文章非常准确地描述了格式,应该可以创建一些Delphi代码来解除这个问题。

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

--jeroen

回答

7

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

 
tdump -um -e dbrtl100.bpl 

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

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

“$”用于标记函数名称的结尾和参数类型的开始。剩下的奥秘就是“qqrx”部分。这由文章Tondrej found揭示。 “qqr”表示调用约定,在这种情况下,其为寄存器,又名fastcall。 “x”适用于参数,意味着它是不变的。

返回类型不需要在mangled函数名称中编码,因为重载不管怎样都不考虑返回类型。

+0

谢谢 - 这有帮助。实际上,-um根本不需要。这只是工作: C:\ WINDOWS \ system32> tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx File STDIN: 00026050 1385 04AC __fastcall Dbcommon :: GetTableNameFromSQLEx(const System :: WideString,Dbcommon :: IDENTIFIEROption) – 2009-10-19 21:35:57

+0

然后我认为这是一个最近的增强。我很确定tdump并不总是这样做。 – 2009-10-20 01:32:23

0

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

+0

实际上,我知道它是哪一个:Delphi 2007 update 3,DBCommon。 这更适用于您没有资源或需要寻找资源的BPL。 我改写了我的问题。不便之处:-) – 2009-10-19 21:33:40

7

另请参阅this article(德文版)。 我想这个补丁可能是向后兼容的,在后来的Delphi版本中引入了新的补丁方案来获得新的语言功能。

+0

谢谢。我读过德语,所以这没有问题。现在我想接受两个答案:-) – 2009-10-20 17:55:17

6

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

+1

Briljant!从那时开始推出?我似乎只有他们的2009年和2010年版本:D2009-企业\源\ cpprtl \源\ misc \ unmangle.c D2010-企业\源\ cpprtl \源\ misc \ unmangle.c 良好的阅读材料: - ) – 2010-02-04 08:04:13

+2

我认为这与BCC本身一样长。但是,该文件在旧版本中称为um.c而不是unmangle.c。 – 2010-02-04 12:11:21