2009-10-19 78 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