2009-10-19 4 views
7

Ist es möglich, Namen wie diese in Delphi zu entfernen? Wenn ja, woher bekomme ich mehr Informationen?Delphi - Namen in BPL's entfernen

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

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

Ich weiß es die Methode GetTableNameFromSQLEx in der Dbcommon Einheit ist (ich habe Delphi mit den RTL/VCL-Quellen), aber manchmal stoße ich in Apps, in denen nicht den gesamten Code für verfügbar ist (ja, sollen Kunden immer kaufen der ganze Quellcode für Sachen von Drittanbietern, aber manchmal nicht.

Aber sagen, das ist ein Beispiel, für das ich nicht den Code oder nur die Schnittstellendateien (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 identisch?

--jeroen

Edit 1:

Dank Rob Kennedy: tdump -e dbrtl100.bpl funktioniert der Trick. Keine Notwendigkeit für -um überhaupt:

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 diese German EDN article (English Google Translation) gefunden. Dieser Artikel beschreibt das Format ziemlich genau, und es sollte möglich sein, etwas Delphi-Code zu erstellen, um das zu entmangeln.

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

--jeroen

Antwort

7

Es gibt keine Funktion, die mit Delphi zur Verfügung steht, die Funktionsnamen entmangelt, und mir ist nicht bewusst, dass es irgendwo dokumentiert ist. Delphi in a Nutshell erwähnt, dass das "tdump" Dienstprogramm einen - Schalter hat, um es zu entmagnetisieren Symbole, die es findet. Ich habe es nie ausprobiert.

 
tdump -um -e dbrtl100.bpl 

Wenn das nicht funktioniert, dann sieht es nicht wie ein sehr kompliziertes Schema aus, um sich zu entwirren. Offensichtlich beginnt der Name mit "@" und wird gefolgt von dem Einheiten- und Funktionsnamen, getrennt durch ein anderes "@" Zeichen. Auf diesen Funktionsnamen folgt "$ qqrx" und dann die Parametertypen.

Die Parametertypen werden mit der Zeichenzahl des Typnamens codiert, gefolgt von demselben "@" - begrenzten Format von zuvor.

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 found. Der "qqr" gibt die Aufrufkonvention an, die in diesem Fall Register, a.k.a. fastcall ist. Das "x" gilt für den Parameter und bedeutet, dass er konstant ist.

Der Rückgabetyp muss nicht im Namen der mangled-Funktion codiert werden, da das Überladen sowieso keine Rückgabetypen berücksichtigt.

+0

Danke - das hilft. Eigentlich wird das -um gar nicht benötigt. Das funktioniert einfach: C: \ WINDOWS \ system32> tdump -e dbtl100.bpl | grep GetTableNameFromSQLEx Datei STDIN: 00026050 1385 04AC __fastcall Dbcommon :: GetTableNameFromSQLEx (const System :: WideString, Dbcommon :: IDENTIFIEROption) –

+0

Ich denke, das ist eine neue Erweiterung, dann. Ich bin mir ziemlich sicher, dass tdump das nicht immer getan hat. –

0

Von den Delphi 2007-Quelldateien:

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

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

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

Borland/CodeGear/Embarcadero verwendet diese Codierung für eine Weile jetzt und nie gab viele Details über finden 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.

+0

Eigentlich weiß ich, welche es ist: Delphi 2007 Update 3, DBCommon. Dies war eher für die BPLs gedacht, für die Sie keine Quellen haben oder nach Quellen suchen müssen. Ich formulierte meine Frage um. Entschuldigung für die Unannehmlichkeiten :-) –

7

Siehe auch this article (auf Deutsch). Ich denke, das Mangling ist wahrscheinlich abwärtskompatibel, und in späteren Delphi-Versionen werden neue Mangling-Schemata für neue Sprachfunktionen eingeführt.

+0

Danke. Ich lese Deutsch, das ist also kein Problem. Jetzt möchte ich zwei Antworten akzeptieren :-) –

6

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

+1

Briljant! Seit wann wurde das eingeführt? Ich scheine nur die 2009 und 2010 Versionen von ihnen zu haben: D2009-Enterprise \ source \ cpprtl \ Quelle \ misc \ unmangle.c D2010-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c Gute Lesestoff: -) –

+2

Ich denke, das ist schon so lange wie BCC selbst. Allerdings hieß die Datei in älteren Versionen um.c anstelle von unmangle.c. –

Verwandte Themen