DIA是microsoft提供的一个有用的库,专门用来解析microsoft的C++编译器所生成的pdb文件。通过此能力就可以在有pdb的情况下编写一些有用的工具。
在安装VS的时候就已经安装了DIA SDK. 路径在$(VsInstallDir)DIA SDK下。
因为该SDK依赖于msdia.dll 这个com组件,因此需要在使用之前注册该组件,即能够在管理员权限之下调用regsvr32 msdia.dll。这里要注意版本区别。
能够需要到的几个文件分别为
Header: include\dia2.h
Library: lib\diaguids.lib
DLL: bin\msdia80.dll
IDL: idl\dia2.idl
程序开头主要是需要包含头文件dia2.h以及链接diaguids.lib。
DataSource代表了DIA SDK所能访问Symbol基本能力的接口,有了能力就能在存在的Symbol 文件上创建session.
需要访问指定的PDB就需要创建session。代表了对一个symbol文件的一次访问行为。
这是最重要的一个接口,其中的接口方法也最多,里面几乎有包含的所有能对symbol文件进行的操作接口或者所创建其他一些子对象。
算是一个辅助的接口,方便迭代symbol的集合
这里给出一个code片段,说明Symbol接口如何得到
- // need to initialize COM
- HRESULT hr = CoInitialize(NULL);
- assert(SUCCEEDED(hr));
-
- // 1. the first interface need to create.
- // it's a source which can access symbol data.
- hr = CoCreateInstance(
- __uuidof(DiaSource),
- NULL,
- CLSCTX_INPROC_SERVER,
- __uuidof(IDiaDataSource),
- (void**)&pSource);
-
- assert(SUCCEEDED(hr));
-
- // 2. load PDB
- hr = (pSource)->loadDataFromPdb(szPdbFilepath);
- assert(SUCCEEDED(hr));
-
- // 3. Create Session
- hr = pSource->openSession(&pSession);
- assert(SUCCEEDED(hr));
-
- // 4. Retrieve a reference to the global scope.
- hr = pSession->get_globalScope(&pGlobal);