是否有可能在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 article(English Google Translation)。 那篇文章非常准确地描述了格式,应该可以创建一些Delphi代码来解决这个问题。
Pitty,作者提到的网站(和电子邮件)现在已经死了,但很高兴知道这些信息。
- 的Jeroen
答案 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格式的细节。我从来没有对它们很感兴趣,因为我讨厌在我的项目中使用运行时库。我更喜欢将它们编译到我的项目中,尽管这会产生更大的可执行文件。