Delphi - nomi unmangle in BPL di
-
22-09-2019 - |
Domanda
E 'possibile unmangle nomi come questi in Delphi? Se sì, dove posso ottenere maggiori informazioni?
Esempio di un messaggio di errore in cui non riesce a trovare una certa voce nella dbrtl100.bpl Vorrei sapere quale esatta funzione non è possibile trovare (unità, classe, nome, parametri, ecc).
---------------------------
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
---------------------------
Lo 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 le 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 ce l'ha (vale a dire che il potenziale sovraccarico)? Che tipo di ritorno ha?
E 'questo pressare lo stesso per qualsiasi versione di Delphi?
- Jeroen
Modifica 1 :
Grazie a Rob Kennedy: tdump -e dbrtl100.bpl fa il trucco. Non c'è bisogno di -um a tutti:
C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)
Modifica 2 :
Grazie a TOndrej che hanno trovato questa tedesco EDN articolo ( Inglese Google Traduttore ) . Tale articolo descrive il formato abbastanza accuratamente, e dovrebbe essere possibile creare un codice Delphi per unmangle questo.
Pitty che il sito web l'autore cita (e l'e-mail) sono ormai morti, ma bene sapere queste informazioni.
- Jeroen
Soluzione
Non c'è funzione fornita con Delphi che unmangle nomi delle funzioni, e io non sono a conoscenza di esso che è documentato da nessuna parte. Delphi in a Nutshell afferma che il "tdump "utilità ha un -um interruttore per rendere simboli unmangle che trova. Non l'ho mai provato.
tdump -um -e dbrtl100.bpl
Se questo non funziona, allora non sembra uno schema molto complicato per unmangle te stesso. Evidentemente, il nome inizia con "@" ed è seguito dal nome dell'unità e le funzioni nome, separati da un altro simbolo "@". Quel nome della funzione è seguito da "$ qqrx" e poi i tipi di parametri.
I tipi di parametri sono codificati utilizzando il numero di caratteri del nome del tipo seguita dalla stessa "@" -. Formato delimitato da prima
Il "$" è necessaria per segnare la fine del nome della funzione e l'inizio dei tipi di parametri. Il mistero che rimane è la parte "qqrx". Questo è rivelato dal Tondrej trovato . Il "qqr" indica la convenzione di chiamata, che in questo caso è Registrati , anche noto come fastcall . La "x" si applica al parametro e significa che è costante.
Il tipo di ritorno non ha bisogno di essere codificate nel nome della funzione mutilato a causa sovraccarico non considera tipi restituiti in ogni caso.
Altri suggerimenti
questo articolo (in tedesco) . Credo che la mutilazione è probabilmente retro-compatibile, e nuovi schemi mangling vengono introdotti nelle successive versioni di Delphi per nuove funzionalità del linguaggio.
Se si dispone di C ++ Builder, controllare $ (BDS) \ fonte \ cpprtl \ Source \ Misc \ unmangle.c - contiene il codice sorgente per il meccanismo utilizzato dal unmangling TDUMP, il debugger e il linker. (C ++ Builder e Delphi usano lo stesso schema di mutilazione.)
Da 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.
Fonte 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 sul formato .bpl. Non sono mai stato molto interessato a loro da quando io odio utilizzando le librerie di runtime nei miei progetti. Io preferisco compilarli in miei progetti, anche se questo si tradurrà in eseguibili molto più grandi.