2013-11-06 1 views
1

Скажет, у меня есть простой класс, как показано ниже:Получить спецификатор доступа для метода класса из PDB через DbgHelp?

class Foo 
{ 
public: 
    Foo(){}; 
protected: 
    int meth1(void){return 0;}; 
public: 
    int var1; 
}; 

Составлены с MSVC и разбором соответствующего PDB через DbgHelp API, я могу перебрать ребенок и разобрать методы и переменные хорошо, но я Я не могу понять, как я определяю спецификатор доступа для данного ребенка. Мой код выглядит примерно так:

// The symbol tag for 'index' is a SymTagEnum::SymTagBaseClass 

DWORD item_count; 
if(!::SymGetTypeInfo(process, base_address, index, TI_GET_CHILDRENCOUNT, &item_count)) 
    break; 

if(item_count > 0) 
{ 
    TI_FINDCHILDREN_PARAMS * item_indexs = new TI_FINDCHILDREN_PARAMS[item_count]; 

    item_indexs->Count = item_count; 
    item_indexs->Start = 0; 

    if(::SymGetTypeInfo(process, base_address, index, TI_FINDCHILDREN, item_indexs)) 
    { 
     for(DWORD i=0 ; i<item_count ; i++) 
     { 
      DWORD item_tag; 
      if(!::SymGetTypeInfo(process, base_address, item_indexs->ChildId[i], TI_GET_SYMTAG, &item_tag)) 
       break; 

      DWORD item_type_index; 
      if(!::SymGetTypeInfo(process, base_address, item_indexs->ChildId[i], TI_GET_TYPEID, &item_type_index)) 
       break; 

      // XXX: How to discover the access specifier (public, private, protected) for 
      // the class method/variable at 'item_type_index'? 

      switch(item_tag) 
      { 
       case SymTagEnum::SymTagFunction: 
       { 
        // parse out the class method at 'item_type_index' 
        break; 
       } 
       case SymTagEnum::SymTagData: 
       { 
        // parse out the class variable at 'item_type_index' 
        break; 
       } 
       default: 
       { 
        break; 
       } 
      } 
     } 
    } 
} 

Можно ли определить спецификаторы доступа (государственные, частные, защищенные) для классов детей через DbgHelp API, и если да, то каким образом?

ответ

1

Да, это технически возможно. Вы получите восстановленное (иначе называемое) имя для функции. В вашем случае это будет [email protected]@@IAEHXZ. Украшенные имена C++ всегда начинаются с вопросительного знака. Вы можете передать это UnDecorateSymbolName() function, чтобы преобразовать его обратно в имя идентификатора C++. Который будет:

protected: int __thiscall Foo::meth1(void) 

Обратите внимание, как он включает спецификатор доступа.

+0

Спасибо, я знаком с UnDecorateSymbolName, но не знаю, как вытащить украшенное имя из символа с помощью индекса символа и API dbghelp? – QAZ

+0

Имеет ли это что-нибудь вообще, чтобы открыть доступность, предмет вопроса? Очевидно, что вам нужно будет сначала получить имя функции. –