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

2014-11-24 12:15:06 · 作者: · 浏览: 10
}
baseClassSymbol->Release();
}
baseClassEnum->Release();
}
PrintXMLClose(file, 2, L"baseClasses");
}

void DumpNestedClasses(TextWriter& file, IDiaSymbol* udtSymbol)
{
PrintXMLOpen(file, 2, L"nestedClasses", NULL, false);
IDiaEnumSymbols* nestedClassEnum=0;
if(SUCCEEDED(udtSymbol->findChildren(SymTagUDT, NULL, nsNone, &nestedClassEnum)) && nestedClassEnum)
{
DWORD nestedClassCelt=0;
IDiaSymbol* nestedClassSymbol=0;
while(SUCCEEDED(nestedClassEnum->Next(1, &nestedClassSymbol, &nestedClassCelt)) && nestedClassSymbol && nestedClassCelt)
{
BSTR nameBSTR=0;
if(SUCCEEDED(nestedClassSymbol->get_name(&nameBSTR)) && nameBSTR)
{
PrintXMLOpen(file, 3, L"nestedClass", nameBSTR);
PrintXMLClose(file, 3, L"nestedClass");
}
nestedClassSymbol->Release();
}
nestedClassEnum->Release();
}
PrintXMLClose(file, 2, L"nestedClasses");
}

void DumpTypedefs(TextWriter& file, IDiaSymbol* udtSymbol)
{
PrintXMLOpen(file, 2, L"typedefs", NULL, false);
IDiaEnumSymbols* typedefEnum=0;
if(SUCCEEDED(udtSymbol->findChildren(SymTagTypedef, NULL, nsNone, &typedefEnum)) && typedefEnum)
{
DWORD typedefCelt=0;
IDiaSymbol* typedefSymbol=0;
while(SUCCEEDED(typedefEnum->Next(1, &typedefSymbol, &typedefCelt)) && typedefSymbol && typedefCelt)

{
BSTR nameBSTR=0;
if(SUCCEEDED(typedefSymbol->get_name(&nameBSTR)) && nameBSTR)
{
PrintXMLOpen(file, 3, L"typedef", nameBSTR);
DumpSymbolType(file, typedefSymbol, 3);
PrintXMLClose(file, 3, L"typedef");
}
typedefSymbol->Release();
}
typedefEnum->Release();
}
PrintXMLClose(file, 2, L"typedefs");
}

void DumpFields(TextWriter& file, IDiaSymbol* udtSymbol)
{
PrintXMLOpen(file, 2, L"fields", NULL);
IDiaEnumSymbols* fieldEnum=0;
if(SUCCEEDED(udtSymbol->findChildren(SymTagData, NULL, nsNone, &fieldEnum)) && fieldEnum)
{
DWORD fieldCelt=0;
IDiaSymbol* fieldSymbol=0;
while(SUCCEEDED(fieldEnum->Next(1, &fieldSymbol, &fieldCelt)) && fieldSymbol && fieldCelt)
{
enum DataKind dataKind;
if(SUCCEEDED(fieldSymbol->get_dataKind((DWORD*)&dataKind)) && (dataKind==DataIsMember || dataKind==DataIsStaticMember || dataKind==DataIsConstant))
{
enum CV_access_e access;
fieldSymbol->get_access((DWORD*)&access);
BSTR nameBSTR=0;
if(SUCCEEDED(fieldSymbol->get_name(&nameBSTR)) && nameBSTR)
{
if(dataKind==DataIsMember)
{
PrintXMLOpen(file, 3, L"field", nameBSTR, L"access", GetAccessName(access));
DumpSymbolType(fi