-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDiaInfo.h
142 lines (131 loc) · 2.98 KB
/
DiaInfo.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#pragma once
#include "SymWrap.h"
BOOL _FindSymbol(IDiaSymbol* sym, LPVOID param);
class CDiaInfo
{
public:
~CDiaInfo()
{
if(m_global) m_global->Release();
if(m_session) m_session->Release();
if(m_spDataSource) m_spDataSource->Release();
}
CString GetSymbolInfo(LPCTSTR path, const PDBSYMBOL& Symbol)
{
CString sRTF;
HRESULT hr = CoInitialize(NULL);
hr = CoCreateInstance(__uuidof(DiaSource),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IDiaDataSource),
(void**)&m_spDataSource);
if (FAILED(hr))
{
return sRTF;
}
wchar_t wszExt[MAX_PATH];
_wsplitpath_s(path, NULL, 0, NULL, 0, NULL, 0, wszExt, MAX_PATH);
if (!_wcsicmp(wszExt, L".pdb"))
{
hr = m_spDataSource->loadDataFromPdb(path);
if (FAILED(hr))
{
return sRTF;
}
}
hr = m_spDataSource->openSession(&m_session);
if (FAILED(hr))
{
return sRTF;
}
IDiaSymbol* symbol = NULL;
m_session->get_globalScope(&m_global);
ULONG celt = 1;
bool bFind = false;
if(Symbol.dwSymTag != 0)
{
CComPtr<IDiaEnumSymbols> enum_symbols = NULL;
m_global->findChildren((enum SymTagEnum)Symbol.dwSymTag, NULL, nsNone, &enum_symbols);
while (SUCCEEDED(enum_symbols->Next(1, &symbol, &celt)) && (celt == 1))
{
CComBSTR bstrName;
symbol->get_name(&bstrName);
_bstr_t tmp(bstrName);
char* tmp_str = (char*)tmp;
if (tmp_str == Symbol.sKey)
{
bFind = true;
break;
}
symbol->Release();
}
if (bFind)
{
CSym* sym = CSym::NewSym(symbol);
sym->Format(&sRTF);
CSym::Delete(sym);
symbol->Release();
}
}
else
{
enum SymTagEnum ste[] = { SymTagUDT, SymTagEnum, SymTagTypedef };
for (int i = 0; i < _countof(ste); ++i)
{
CComPtr<IDiaEnumSymbols> enum_symbols = NULL;
m_global->findChildren(ste[i], NULL, nsNone, &enum_symbols);
while (SUCCEEDED(enum_symbols->Next(1, &symbol, &celt)) && (celt == 1))
{
CComBSTR bstrName;
symbol->get_name(&bstrName);
_bstr_t tmp(bstrName);
char* tmp_str = (char*)tmp;
if (tmp_str == Symbol.sKey)
{
bFind = true;
break;
}
symbol->Release();
}
if (bFind)
{
CSym* sym = CSym::NewSym(symbol);
sym->Format(&sRTF);
CSym::Delete(sym);
symbol->Release();
break;
}
}
}
return sRTF;
}
CString GetSymbolInfo(IDiaSymbol* sym_global, const PDBSYMBOL& Symbol)
{
CString sRTF;
auto find_symbol = CSym::Enum(sym_global, SymTagNull, _FindSymbol, (PVOID)Symbol.dwSymId);
if (find_symbol)
{
CSym* sym = CSym::NewSym(find_symbol);
sym->Format(&sRTF);
CSym::Delete(sym);
}
return sRTF;
}
CString GetEmptyInfo(CTreeViewCtrl& ctrlTree) const
{
CString sRTF, sTitle;
ctrlTree.GetItemText(ctrlTree.GetSelectedItem(), sTitle);
sRTF = sTitle;
return sRTF;
}
private:
IDiaDataSource* m_spDataSource = NULL;
IDiaSession* m_session = NULL;
IDiaSymbol *m_global = NULL;
};
BOOL _FindSymbol(IDiaSymbol* sym, LPVOID param)
{
DWORD id;
sym->get_symIndexId(&id);
return id == (DWORD)param;
}