2009-10-19 10 views
7

È possibile rimuovere nomi come questi in Delphi? Se sì, dove posso ottenere maggiori informazioni?Delphi: annulla i nomi in BPL

Esempio di messaggio di errore in cui non è possibile trovare una determinata voce nel dbrtl100.bpl Desidero sapere quale funzione esatta non è in grado di trovare (unità, classe, nome, parametri, ecc.).

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

So che è il metodo GetTableNameFromSQLEx nell'unità Dbcommon (ho Delphi con le fonti RTL/VCL), ma a volte mi imbatto in applicazioni in cui non tutto il codice è disponibile per (sì, i clienti dovrebbero sempre comprare tutto il codice sorgente per cose di terze parti, ma a volte non lo fanno).

Ma dire che questo è un esempio per il quale non ho il codice, o solo i file di interfaccia (BDE.INT chiunque?) Quali parametri ha (cioè quale sovraccarico potenziale)? Quale tipo di reso ha?

Questo tipo di manipolazione è uguale per qualsiasi versione Delphi?

--jeroen

Modifica 1:

Grazie a Rob Kennedy: tdump -e dbrtl100.bpl fa il trucco. Non c'è bisogno di -um affatto:

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

Edit 2:

Grazie a TOndrej che hanno trovato questa German EDN article (English Google Translation). Questo articolo descrive il formato in modo abbastanza accurato e dovrebbe essere possibile creare un codice Delphi per rimuoverlo.

Peccato che il sito web menzionato dall'autore (e l'e-mail) sia morto, ma buono a sapere queste informazioni.

--jeroen

risposta

7

Non è presente alcuna funzione fornita con Delphi che decodificherà i nomi delle funzioni, e non sono a conoscenza del fatto che sia documentata ovunque. Delphi in a Nutshell menziona che l'utilità "tdump" ha uno switch -um per farlo separare i simboli che trova. Non l'ho mai provato

 
tdump -um -e dbrtl100.bpl 

Se ciò non funziona, allora non sembra uno schema molto complicato per districarsi. Evidentemente, il nome inizia con "@" ed è seguito dal nome dell'unità e dal nome della funzione, separati da un altro segno "@". Il nome di questa funzione è seguito da "$ qqrx" e quindi dai tipi di parametro.

I tipi di parametro sono codificati utilizzando il numero di caratteri del nome del tipo seguito dallo stesso formato "@" delimitato da prima.

Il "$" è necessario per contrassegnare la fine del nome della funzione e l'inizio dei tipi di parametro. Il mistero rimanente è la parte "qqrx". Questo è rivelato dall'articolo Tondrej found. Il "qqr" indica la convenzione di chiamata, che in questo caso è registro, a.k.a fastcall. La "x" si applica al parametro e significa che è costante.

Il tipo di ritorno non ha bisogno di essere codificato nel nome della funzione di storto perché l'overloading non considera comunque i tipi di ritorno.

+0

Grazie - questo aiuta. In realtà, l'-um non è affatto necessario. Funziona solo: C: \ WINDOWS \ system32> tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx File STDIN: 00026050 1385 04AC __fastcall Dbcommon :: GetTableNameFromSQLEx (const System :: WideString, Dbcommon :: IDENTIFIEROption) –

+0

Penso che sia un miglioramento recente, quindi. Sono piuttosto sicuro che tdump non lo abbia sempre fatto. –

0

dai file di origine Delphi 2007:

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

Questa sembra essere la stessa versione, dal momento che ho anche la stessa .bpl nella mia cartella Windows \ System32.

sorgente può essere trovato in [Program Files cartelle] \ CodeGear \ RAD Studio \ 5.0 \ fonte \ Win32 \ db

Borland/CodeGear/Embarcadero ha utilizzato questa codifica per un po 'di tempo e non ha mai dato molti dettagli su il formato .BPL. Non mi sono mai interessato molto a loro dato che odio usare le librerie di runtime nei miei progetti. Preferisco compilarli nei miei progetti, anche se questo si tradurrà in eseguibili molto più grandi.

+0

In realtà, so qual è: Delphi 2007 update 3, DBCommon. Questo era più significato per i BPL per i quali non si dispone di fonti, o bisogno di cacciare per le fonti. Ho riformulato la mia domanda. Ci scusiamo per l'inconveniente :-) –

7

Vedere anche this article (in tedesco). Immagino che il mangling sia probabilmente compatibile con le versioni precedenti e nuovi schemi di mangling vengono introdotti nelle successive versioni di Delphi per le nuove funzionalità del linguaggio.

+0

Grazie. Ho letto il tedesco, quindi non è un problema. Ora voglio accettare due risposte :-) –

6

Se si dispone di C++ Builder, controllare $ (BDS) \ source \ cpprtl \ Source \ misc \ unmangle.c - contiene il codice sorgente per il meccanismo di distrubuzione utilizzato da TDUMP, dal debugger e dal linker. (C++ Builder e Delphi usano lo stesso schema di maneggevolezza.)

+1

Briljant! Da quando è stato introdotto? Mi sembra di avere solo le versioni 2009 e 2010 di D2009-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c D2010-Enterprise \ source \ cpprtl \ Source \ misc \ unmangle.c Materiale di buona lettura: -) –

+2

Penso che questo sia stato in giro fino a quando BCC stesso. Tuttavia il file è stato chiamato um.c invece di unmangle.c nelle versioni precedenti. –