使用VS API开发一个PDB Dumper并且可以在没装VS2010的计算机上运行 (四)

2014-11-24 12:15:06 · 作者: · 浏览: 15
// enumerate classes
IDiaEnumSymbols* udtEnum=0;
if(SUCCEEDED(exeSymbol->findChildren(SymTagUDT, NULL, nsNone, &udtEnum)))
{
DWORD udtCelt=0;
IDiaSymbol* udtSymbol=0;
while(SUCCEEDED(udtEnum->Next(1, &udtSymbol, &udtCelt)) && udtSymbol && udtCelt)
{
AddUdtOrRelease(udtSymbol);
}
}
}
{
// enumerate enums
IDiaEnumSymbols* enumEnum=0;
if(SUCCEEDED(exeSymbol->findChildren(SymTagEnum, NULL, nsNone, &enumEnum)))
{
DWORD enumCelt=0;
IDiaSymbol* enumSymbol=0;
while(SUCCEEDED(enumEnum->Next(1, &enumSymbol, &enumCelt)) && enumSymbol && enumCelt)
{
AddUdtOrRelease(enumSymbol);
}
}
}
{
// enumerate compilands
IDiaEnumSymbols* compilandEnum=0;
if(SUCCEEDED(exeSymbol->findChildren(SymTagCompiland, NULL, nsNone, &compilandEnum)))
{
DWORD compilandCelt=0;
IDiaSymbol* compilandSymbol=0;
while(SUCCEEDED(compilandEnum->Next(1, &compilandSymbol, &compilandCelt)) && compilandSymbol && compilandCelt)
{
// enumerate functions
IDiaEnumSymbols* functionEnum=0;
if(SUCCEEDED(compilandSymbol->findChildren(SymTagFunction, NULL, nsNone, &functionEnum)))
{
DWORD functionCelt=0;
IDiaSymbol* functionSymbol=0;
while(SUCCEEDED(functionEnum->Next(1, &functionSymbol, &functionCelt)) && functionSymbol && functionCelt)
{
IDiaSymbol* udtType=0;
if(SUCCEEDED(functionSymbol->get_classParent(&udtType)) && udtType)
{
AddUdtOrRelease(udtType);
functionSymbol->Release();
}
else
{
AddFuncOrRelease(functionSymbol);
}
}
functionEnum->Release();
}
compilandSymbol->Release();
}
compilandEnum->Release();
}
}
}

//--------------------------------------------------------------------

const wchar_t* GetAccessName(enum CV_access_e access)
{
switch(access)
{
case CV_private: return L"private";
case CV_protected: return L"protected";
case CV_public: return L"public";
default: return L"";
}
}

const wchar_t* GetCallingConversionName(enum CV_call_e callconv)
{
switch(callconv)
{
case CV_CALL_NEAR_C: return L"cdecl";
case CV_CALL_NEAR_FAST: return L"fastcall";
case CV_CALL_NEAR_STD: return L"stdcall";
case CV_CALL_NEAR_SYS: return L"syscall";
case CV_CALL_THISCALL: ret