classSymbol->get_symTag((DWORD*)&symTag);
if(symTag==SymTagUDT)
{
PrintXMLOpen(file, 1, L"class", className.Buffer());
DumpBaseClasses(file, classSymbol);
DumpNestedClasses(file, classSymbol);
DumpTypedefs(file, classSymbol);
DumpFields(file, classSymbol);
DumpMethods(file, classSymbol);
PrintXMLClose(file, 1, L"class");
}
else if(symTag==SymTagEnum)
{
PrintXMLOpen(file, 1, L"enum", className.Buffer());
DumpFields(file, classSymbol);
PrintXMLClose(file, 1, L"enum");
}
}
for(int i=0;i
udtSymbols.Values()[i]->Release();
}
udtSymbols.Clear();
PrintXMLOpen(file, 1, L"functions", NULL);
for(int i=0;i
IDiaSymbol* funcSymbol=funcSymbols.Values()[i];
DumpMethod(file, funcSymbol);
}
PrintXMLClose(file, 1, L"functions");
for(int i=0;i
funcSymbols.Values()[i]->Release();
}
funcSymbols.Clear();
}
void DumpPdbToXml(IDiaSymbol* exeSymbol, const wchar_t* xml)
{
FileStream fileStream(xml, FileStream::WriteOnly);
CacheStream cacheStream(fileStream, 1048576);
BomEncoder encoder(BomEncoder::Utf16);
EncoderStream encoderStream(cacheStream, encoder);
StreamWriter file(encoderStream);
PrintString(file, L"< xml version=\"1.0\" encoding=\"utf-16\" >\r\n");
PrintXMLOpen(file, 0, L"pdb", NULL);
Dump(file, exeSymbol);
PrintXMLClose(file, 0, L"pdb");
}
}
下一篇文章将讲到我如何使用上面的程序产生的xml和Visual Studio的本地C++编译器生成的XML文档,来合并成一个完整的XML描述的文档。
摘自 λ-calculus(惊愕到手了欧耶)