Ist es möglich, solche Namen in Delphi zu entfernen? Wenn ja, wo bekomme ich mehr Informationen?
Beispiel für eine Fehlermeldung, bei der ein bestimmter Eintrag in dbrtl100.bpl nicht gefunden werden kann Ich möchte wissen, welche genaue Funktion es nicht finden kann (Einheit, Klasse, Name, Parameter usw.).
%Vor%Ich weiß, dass es die Methode GetTableNameFromSQLEx in der Dbcommon Unit ist (ich habe Delphi mit den RTL / VCL-Quellen), aber manchmal stoße ich auf Apps, wo nicht jeder Code verfügbar ist (ja, Kunden sollten immer den gesamten Quellcode kaufen) für Sachen von Drittanbietern, aber manchmal nicht.)
Aber sag das ist ein Beispiel, für das ich den Code nicht habe, oder nur die Interface-Dateien (BDE.INT irgendjemand?) Welche Parameter hat es (d. H. Welche mögliche Überlastung)? Welchen Rückgabetyp hat es?
Ist das für jede Delphi-Version gleich?
- Jeroen
Bearbeiten 1 :
Danke an Rob Kennedy: tdump -e dbtl100.bpl macht den Trick. Keine Notwendigkeit für -um :
%Vor%Bearbeiten Sie 2 :
Danke an Tornrej, der diesen deutschen EDN-Artikel gefunden hat ( Englisch Google Übersetzung ). Dieser Artikel beschreibt das Format ziemlich genau, und es sollte möglich sein, etwas Delphi-Code zu erstellen, um das zu entmangeln.
Schade, dass die Webseite, die der Autor erwähnt (und die E-Mail), jetzt tot ist, aber es ist gut, diese Information zu kennen.
- Jeroen
In Delphi gibt es keine Funktion, die Funktionsnamen entmangelt, und ich weiß nicht, dass sie irgendwo dokumentiert ist. Delphi in Kürze erwähnt, dass das Dienstprogramm "tdump" über -um um die gefundenen Symbole zu entmagnetisieren. Ich habe es noch nie probiert.
%Vor%Wenn das nicht funktioniert, dann sieht es nicht nach einem sehr komplizierten Schema aus, um sich selbst zu entwirren. Offensichtlich beginnt der Name mit "@" und wird gefolgt vom Namen der Einheit und der Funktion, getrennt durch ein anderes "@" Zeichen. Auf diesen Funktionsnamen folgt "$ qqrx" und dann die Parametertypen.
Die Parametertypen werden mit der Zeichenanzahl des Typnamens codiert, gefolgt von demselben "@" - Trennzeichen von vor.
Das "$" ist notwendig, um das Ende des Funktionsnamens und den Anfang der Parametertypen zu markieren. Das verbleibende Geheimnis ist der "qqrx" -Teil. Das zeigt der Artikel Tondrej gefunden . Der "qqr" gibt die Aufrufkonvention an, die in diesem Fall register ist, a.k.a. fastcall . Das "x" gilt für den Parameter und bedeutet, dass es konstant ist.
Der Rückgabetyp muss nicht im Namen der mangled-Funktion codiert werden, da das Überladen sowieso keine Rückgabetypen berücksichtigt.
Siehe auch diesen Artikel (auf Deutsch). Ich nehme an, dass das Mangling wahrscheinlich abwärtskompatibel ist und in späteren Delphi-Versionen neue Mangling-Schemata für neue Sprachfunktionen eingeführt werden.
Wenn Sie C ++ Builder haben, überprüfen Sie $ (BDS) \ source \ cpprtl \ Source \ misc \ unmangle.c - es enthält den Quellcode für den Mechanismus zur Aufhebung der Zuordnung, der von TDUMP, dem Debugger und dem Linker verwendet wird. (C ++ Builder und Delphi verwenden dasselbe Mangling-Schema.)
Aus den Delphi 2007-Quelldateien:
%Vor%Dies scheint die gleiche Version zu sein, da ich auch die gleiche .BPL in meinem Windows \ System32-Ordner habe.
Die Quelle befindet sich in [Programme] \ CodeGear \ RAD Studio \ 5.0 \ source \ Win32 \ db
Borland / Codegear / Embarcadero hat diese Codierung schon seit einiger Zeit verwendet und gab nie viele Details über das .BPL-Format. Ich war nie sehr an ihnen interessiert, da ich in meinen Projekten keine Laufzeitbibliotheken verwende. Ich ziehe es vor, sie in meine Projekte zu kompilieren, obwohl dies zu viel größeren ausführbaren Dateien führen wird.
Tags und Links delphi name-mangling bpl