2010-07-27 19 views
0

Je dois remplacer les allocateurs par leur code source d'origine. J'extrais des méthodes exportées de la table d'exportation de PE et fais face aux allocateurs longs étranges où les récipients de STL ont été employés dans le code source original. à savoir si le code source est:Comment remplacer les allocateurs de stl par le code source réel

typedef std::list<std::basic_string<_TCHAR> > TokenList; 
    EXPORTS_API const TokenList& getLiteralList(); 

de la table d'exportation Je reçois:

std::list<class std::basic_string<unsigned short, std::char_traits<unsigned short>,class 
std::allocator<unsigned short> >,class std::allocator<class std::basic_string<unsigned 
short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > > > 
const & __thiscall CExpressionTokenizer::getLiteralList(void) 

Comment puis-je obtenir le backtrack des allocataires longs ci-dessus à son code source original? (Typedefs augmentent plus en taille.)

Cordialement,

Usman

Répondre

1

Je pense que vous voulez dire que vous voulez être en mesure de déterminer un nom de type plus succinct de la table d'exportation. L'allocateur standard (std::allocator) est le paramètre de modèle par défaut pour le paramètre allocator dans la plupart des modèles de classes de conteneur standard. Vous pouvez donc simplement supprimer l'ensemble du paramètre allocator de la spécialisation de modèle pour obtenir une expression plus simple du même type.

E.g.

std::list<class std::basic_string<unsigned short, std::char_traits<unsigned short>,class 
std::allocator<unsigned short> >,class std::allocator<class std::basic_string<unsigned 
short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > > > 
const & __thiscall CExpressionTokenizer::getLiteralList(void) 

devient

std::list<class std::basic_string<unsigned short, std::char_traits<unsigned short> > > 
const & __thiscall CExpressionTokenizer::getLiteralList(void) 
0

Je crois que vous parlez de décoder les messages d'erreur? Essayez STLFilt.

+0

Je pensais que d'abord, mais pour autant que je sache, il a un utilitaire qui extrait les noms d'un exécutable. Ces noms sont criblés de trucs d'allocateurs (comme ils devraient l'être), et il veut se débarrasser d'eux, je pense. – GManNickG

+0

ouais définitivement. Je souhaite remplacer exactement mon code source original à la place de ces attributions. En fait, j'ai besoin de montrer ces types et méthodes extraites (que j'ai pris de la table d'exportation) à l'interface graphique ou dire quelques XMLs. Donc en tant qu'utilisateur je ne reconnaîtrai pas ces allocateurs – Usman

+0

Vous ne pouvez pas avoir un remplacement exact. Les allocateurs dans les conteneurs STL ne sont qu'un exemple d'arguments par défaut. Par exemple. 'std :: set ' aura aussi une commande par défaut 'std :: less '. Après la compilation, vous ne pouvez plus savoir si un argument par défaut a été fourni ou non. Cela ne veut pas dire typedefs ('std :: string' est vraiment' std :: basic_string ') – MSalters