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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top