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

2014-11-24 12:15:06 · 作者: · 浏览: 1
ame(TextWriter& file, const wchar_t* name)
{
const wchar_t* head=name;
const wchar_t* reading=head;
while(*reading)
{
switch(*reading)
{
case L'<':
PrintString(file, head, reading-head);
PrintString(file, L"<");
head=reading+1;
reading=head;
break;
case L'>':
PrintString(file, head, reading-head);
PrintString(file, L">");
head=reading+1;
reading=head;
break;
case L'&':
PrintString(file, head, reading-head);
PrintString(file, L"&");
head=reading+1;
reading=head;
break;
case L'\"':
PrintString(file, head, reading-head);
PrintString(file, L""");
head=reading+1;
reading=head;
break;
default:
reading++;
}
}
PrintString(file, head, reading-head);
}

void PrintXMLOpen(
TextWriter& file, int level, const wchar_t* tagName, const wchar_t* symbolName
,const wchar_t* a1=0, const wchar_t* v1=0
,const wchar_t* a2=0, const wchar_t* v2=0
,const wchar_t* a3=0, const wchar_t* v3=0
)
{
PrintSpaces(file, level);
PrintString(file, L"<");
PrintString(file, tagName);
if(symbolName)
{
PrintString(file, L" name=\"");
PrintEscapedName(file, symbolName);
PrintString(file, L"\"");
}
if(a1)
{
PrintString(file, L" ");
PrintString(file, a1);
PrintString(file, L"=\"");
PrintEscapedName(file, v1);
PrintString(file, L"\"");
}
if(a2)
{
PrintString(file, L" ");
PrintString(file, a2);
PrintString(file, L"=\"");
PrintEscapedName(file, v2);
PrintString(file, L"\"");
}
if(a3)
{
PrintString(file, L" ");
PrintString(file, a3);
PrintString(file, L"=\"");
PrintEscapedName(file, v3);
PrintString(file, L"\"");
}
PrintString(file, L" >\r\n");
}

void PrintXMLClose(TextWriter& file, int level, const wchar_t* tagName)
{
PrintSpaces(file, level);
PrintString(file, L" PrintString(file, tagName);
PrintString(file, L">\r\n");
}

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

Dictionary udtSymbols;
Dictionary funcSymbols;

void AddOrRelease(Dictionary& symbols, IDiaSymbol* symbol)
{
// get name
BSTR nameBSTR=0;
if(SUCCEEDED(symbol->get_name(&nameBSTR)) && nameBSTR)
{
WString name=nameBSTR;
if(!symbols.Keys().Contains(name))
{
// record class symbol
symbols.Add(name, symbol);
symbol=0;
}
}
if(symbol) symbol->Release();
}

void AddUdtOrRelease(IDiaSymbol* udtType)
{
AddOrRelease(udtSymbols, udtType);
}

void AddFuncOrRelease(IDiaSymbol* funcSymbol)
{
AddOrRelease(funcSymbols, funcSymbol);
}

void FindClasses(IDiaSymbol* exeSymbol)
{
{