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

2014-11-24 12:15:06 · 作者: · 浏览: 12
PrintXMLClose(file, level+2, L"argument");
argumentType->Release();
}
argumentSymbol->Release();
}
argumentEnum->Release();
}
}
PrintXMLClose(file, level+1, L"arguments");
}
IDiaSymbol* returnTypeSymbol=0;
if(SUCCEEDED(typeSymbol->get_type(&returnTypeSymbol)) && returnTypeSymbol)
{
PrintXMLOpen(file, level+1, L"return", NULL);
DumpType(file, returnTypeSymbol, level+2);
PrintXMLClose(file, level+1, L"return");
returnTypeSymbol->Release();
}
PrintXMLClose(file, level, L"function");
}

void DumpPointerType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
IDiaSymbol* elementTypeSymbol=0;
if(SUCCEEDED(typeSymbol->get_type(&elementTypeSymbol)) && elementTypeSymbol)
{
BOOL lref=FALSE;
BOOL rref=FALSE;
typeSymbol->get_reference(&lref);
typeSymbol->get_RValueReference(&rref);
if(lref)
{
DumpTypeHelper(file, typeSymbol, level, L"reference", NULL, false);
DumpType(file, elementTypeSymbol, level+1);
PrintXMLClose(file, level, L"reference");
}
else if(rref)
{
DumpTypeHelper(file, typeSymbol, level, L"rightValueReference", NULL, false);

DumpType(file, elementTypeSymbol, level+1);
PrintXMLClose(file, level, L"rightValueReference");
}
else
{
DumpTypeHelper(file, typeSymbol, level, L"pointer", NULL, false);
DumpType(file, elementTypeSymbol, level+1);
PrintXMLClose(file, level, L"pointer");
}
elementTypeSymbol->Release();
}
}

void DumpArrayType(TextWriter& file, IDiaSymbol* typeSymbol, int level)
{
IDiaSymbol* indexTypeSymbol=0;
IDiaSymbol* elementTypeSymbol=0;
if(SUCCEEDED(typeSymbol->get_type(&elementTypeSymbol)) && elementTypeSymbol)
{
ULONGLONG arraySize=0, elementSize=0;
typeSymbol->get_length(&arraySize);
elementTypeSymbol->get_length(&elementSize);
int elementCount=arraySize (int)(arraySize/elementSize):0;
wchar_t elementCountBuffer[20];
_itow_s(elementCount, elementCountBuffer, 10);

DumpTypeHelper(file, typeSymbol, level, L"array", NULL, false);
PrintXMLOpen(file, level+1, L"count", NULL, L"value", elementCountBuffer);
PrintXMLClose(file, level+1, L"count");
if(SUCCEEDED(typeSymbol->get_arrayIndexType(&indexTypeSymbol)) && indexTypeSymbol)
{
PrintXMLOpen(file, level+1, L"index", NULL);
DumpType(file, indexTypeSymbol, level+2);
PrintXMLClose(file, level+1, L"index");
indexTypeSymbol->Release();
}
PrintXMLOpen(file, level+1, L"element", NULL);
DumpType(file, elementTypeSymbol, level+2);