Frage

Ist es möglich, unmangle Namen wie diese in Delphi? Wenn ja, wo finde ich weitere Informationen erhalten?

Beispiel einer Fehlermeldung, wo es nicht einen bestimmten Eintrag in der dbrtl100.bpl finden Ich möchte wissen, welche genaue Funktion nicht finden kann (Einheit, Klasse, Namen, Parameter, etc.).

---------------------------
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   
---------------------------

Ich weiß, es ist die Methode GetTableNameFromSQLEx in der Dbcommon Einheit (Ich habe Delphi mit den RTL / VCL-Quellen), aber manchmal stoße ich apps in denen nicht alle Code für verfügbar sind (ja, sollten Kunden kaufen immer alle die Quellcode für 3rd-Party-Sachen, aber manchmal sind sie nicht).

Aber sagen, dies ist ein Beispiel für die ich den Code nicht haben, oder nur die Schnittstellendateien (BDE.INT anyone?) Welche Parameter hat es (das heißt die potentielle Überlast)? Welcher Rückgabetyp hat es?

Ist das das gleiche für jede Delphi-Version Mangeln?

- jeroen

Bearbeiten 1 :

Dank Rob Kennedy: tdump-dbrtl100.bpl funktioniert den Trick. Keine Notwendigkeit für -um bei allen:

C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)

Edit 2 :

Dank TOndrej, die diesen Deutsch EDN Artikel ( Englisch Google Übersetzen ) . Dieser Artikel beschreibt das Format ziemlich genau, und es sollte möglich sein, einige Delphi-Code zu unmangle dies zu schaffen.

Pitty, dass die Website der Autor erwähnt (und die E-Mail) ist jetzt tot, aber gut, diese Informationen zu kennen.

- jeroen

War es hilfreich?

Lösung

Es gibt keine Funktion mit Delphi zur Verfügung gestellt, das wird unmangle Funktionsnamen, und ich bin mir nicht bewusst es überall dokumentiert. Delphi in a Nutshell erwähnt dass die „tdump "Dienstprogramm hat eine -um schalten sie es unmangle Symbole machen es findet. Ich habe es nie versucht.

tdump -um -e dbrtl100.bpl

Wenn das nicht funktioniert, dann sieht es nicht wie eine sehr komplizierte Regelung unmangle selbst. Offensichtlich beginnt der Name mit „@“ und wird durch die Gerätenamen und Funktionsnamen, getrennt durch ein anderes Zeichen „@“ gefolgt. Diese Funktion Name wird von „$ qqrx“ gefolgt und dann die Parametertypen.

Die Parametertypen werden codiert, um die Anzahl der Zeichen des Typs Namen von den gleichen gefolgt „@“ -. Getrennten Format aus der Zeit vor

Der „$“ ist notwendig, um das Ende des Funktionsnamen und den Beginn der Parametertypen zu markieren. Das verbleibende Geheimnis ist das „qqrx“ teil. Das ist, offenbart durch den Artikel Tondrej . Die "QQR" zeigt die Aufrufkonvention, die in diesem Fall ist registrieren , auch bekannt als Fastcall . Das „x“ gilt für den Parameter und bedeutet, dass es konstant ist.

Der Rückgabetyp muss nicht in den verstümmelten Funktionsnamen codiert werden, da eine Überlastung nicht berücksichtigt Rückgabetypen sowieso.

Andere Tipps

Siehe auch dieser Artikel (in deutscher Sprache) . Ich denke, das Mangeln ist wahrscheinlich abwärtskompatibel und neue Mangeln Systeme werden in späteren Delphi-Versionen für neue Sprachfunktionen eingeführt.

Wenn Sie C ++ Builder, überprüfen $ (BDS) \ source \ cpprtl \ Source \ misc \ unmangle.c - es enthält den Quellcode für den unmangling Mechanismus von TDUMP verwendet, Debugger und Linker. (C ++ Builder und Delphi verwenden das gleiche Schema Mangeln.)

Von den Delphi 2007-Quelldateien:

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

Dies scheint die gleiche Version zu sein, da ich auch die gleiche .BPL in meinem Windows \ System32 Ordner befindet.

kann Quelle in [Program Files Ordner] \ CodeGear \ RAD Studio \ 5.0 \ source \ Win32 \ db

Borland / CodeGear / Embarcadero hat diese Codierung für ein verwendet, während jetzt und nie viele Details über das .BPL Format gab. Ich habe noch nie in ihnen sehr interessiert, da ich Runtime-Bibliotheken in meinen Projekten hate verwenden. Ich ziehe sie in meine Projekte zu kompilieren, obwohl dies viel größere ausführbare Dateien führen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top