Question

Est-il possible de unmangle des noms comme ceux-ci à Delphes? Si oui, où puis-je obtenir plus d'informations?

Exemple d'un message d'erreur où il ne peut pas trouver une certaine entrée dans le dbrtl100.bpl Je veux savoir quelle fonction exacte, il ne peut pas trouver (unité, classe, nom, paramètres, etc.).

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

Je sais que c'est la méthode GetTableNameFromSQLEx dans l'unité Dbcommon (je Delphi avec les RTL / sources VCL), mais parfois je bosse dans les applications où pas tout le code est disponible pour (oui, les clients doivent toujours acheter tout le code source pour des choses 3ème partie, mais parfois ils ne le font pas).

Mais dire ceci est un exemple pour lequel je n'ai pas le code, ou uniquement les fichiers d'interface (tout le monde BDE.INT?) Quels paramètres at-il (ce qui surcharge potentiel)? Quel type de retour t-il?

Est-ce mutiler la même chose pour toute version Delphi?

- jeroen

Modifier 1 :

Merci à Rob Kennedy: tdump -e dbrtl100.bpl fait le tour. Pas besoin de -um du tout:

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

Edit 2 :

Merci à TOndrej qui ont trouvé cette article allemand EDN ( Anglais Google Traduction ) . Cet article décrit le format assez exactement, et il devrait être possible de créer un code Delphi pour unmangle cela.

Pitty que le site de l'auteur mentionne (et l'e-mail) sont maintenant morts, mais bien de connaître cette information.

- jeroen

Était-ce utile?

La solution

Il n'y a pas de fonction fournie avec Delphi qui unmangle les noms de fonctions, et je ne suis pas au courant documenté nulle part. Delphi dans un Nutshell mentionne que la « tdump "utilitaire a une -um commutateur pour rendre les symboles unmangle qu'il trouve. Je ne l'ai jamais essayé.

tdump -um -e dbrtl100.bpl

Si cela ne fonctionne pas, alors il ne ressemble pas à un système très compliqué pour vous unmangle. De toute évidence, le nom commence par « @ » et est suivi du nom de nom de l'unité et de la fonction, séparés par un autre signe « @ ». Ce nom de la fonction est suivie par « qqrx de $ », puis les types de paramètres.

Les types de paramètres sont codés en utilisant le nombre de caractères du nom de type suivi par le même « @ » -. Format délimité par d'avant

Le « $ » est nécessaire pour marquer la fin du nom de la fonction et le début des types de paramètres. Le mystère reste est la partie « qqrx ». Ce qui est révélé par le Tondrej trouvé . Le "QQR" indique la convention d'appel, qui dans ce cas est vous inscrire , a.k.a. fastcall . Le « x » applique au paramètre et signifie qu'il est constant.

Le type de retour n'a pas besoin d'être codé dans le nom de la fonction mutilée parce que la surcharge ne considère pas les types de retour de toute façon.

Autres conseils

Voir aussi cet article (en allemand) . Je suppose que le mutiler est probablement rétrocompatible, et de nouveaux systèmes de sont introduit en codage différents versions ultérieures Delphi pour de nouvelles fonctions linguistiques.

Si vous avez C ++ Builder, consultez $ (BDS) \ source de \ cpprtl \ Source \ misc \ unmangle.c - il contient le code source pour le mécanisme utilisé par unmangling TDUMP, le débogueur et l'éditeur de liens. (C ++ Builder et Delphi utilisent le même schéma de mutiler.)

A partir des fichiers source Delphi 2007:

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

Cela semble être la même version, puisque j'ai aussi le même .BPL dans mon dossier Windows \ System32.

La source peut être trouvée dans [dossiers Program Files] \ CodeGear \ RAD Studio \ 5.0 \ source de \ win32 \ db

Borland / CodeGear / Embarcadero a utilisé ce codage pour un certain temps maintenant et n'a jamais donné beaucoup de détails sur le format .BPL. Je ne l'ai jamais été très intéressé par eux depuis que je déteste utiliser les bibliothèques d'exécution dans mes projets. Je préfère les compiler dans mes projets, même si cela se traduira par executables beaucoup plus grand.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top