我想从dll中获取一些我正在调试的程序链接到的信息: 所以 - 我注意到我的调试器为发生崩溃的库下载了一个pdb,我尝试在其上运行dia2dump:
dia2dump -all mfc90.i386.pdb \ 05089943A3B2462891FBF83E29A72618E \ mfc90.i386.pd _
但dia2dump回复:
loadDataForExe失败 - HRESULT = 806d0012
我不知道那个错误信息是什么意思......但是我想(猜)是因为我的msdia.dll版本太旧了,因为我可以从80级的旧版dll中转储pdb;我检查了我安装的dia.dll,它是msdia80.dll,所以 - 我去了msdia90.dll - 我现在注册了(regsvr32.exe msdia90.dll),所以我安装了dia80.dll和dia90.dll。但是,dia2dump只在运行时共同创建dia80.dll ....即使我取消注册它,但是留下dia90注册 - dia2dump然后会抱怨它根本找不到dll。 (CoCreateInstance失败 - HRESULT = 80040154)
我不确定这是因为我是在32位机器上,还是因为我在VS2008下编译...或者我在某种程度上注册了错误的dia90.dll ......或者是什么?我怎么弄明白呢?
这是我到目前为止所尝试的:
我修改了dia2dump.cpp,根据类DiaSource的前向引用的__uuid()加载dll;我希望__uuid()能够在注册表中找到该类的活动版本并提供正确的数字,但VS2008显然不能以这种方式工作 - 它以其他方式计算__uuidof()。因为即使删除了diaguid.Lib,并且CLSID_DiaSource变得未定义(我验证它找不到它。)使用__uuidof(DiaSource)仍然导致它找到msdia80.dll的CLSID - 而不是90.
typedef class DiaSource;
hr = CoCreateInstance(__uuidof(DiaSource),//CLSID_DiaSource,
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IDiaDataSource),
(void **) ppSource);
那么,为什么这也没有链接到msdia90.dll的CLSID? 我没有版本90的diaguid.Lib - 只是dll。但我知道,在注册表中有两个uuid / CLSID - 每个版本的dll都有一个。
HKEY_CLASSES_ROOT / CLSID / 4C41678E-887B-4365-A09E-925D28DB33C2#msdia90.dll HKEY_CLASSES_ROOT / CLSID / BCE36434-2C24-499E-BF49-8BD99B0EEB68#msdia80.dll
虽然,在最新的MSDN页面(2013)中,变量的名称仍然是CLSID_DiaSource,表明该类在新的dll中命名相同...所以我不知道为什么有两个dll的不同CLSID ... http://msdn.microsoft.com/en-us/library/hd8h6f46%28v=vs.120%29.aspx
编辑: 我认为,通过将这个技巧作为一种解决方法,它可以链接(CoCreate),但是当我使用版本90运行它时仍然会发生原始错误 - 所以我的猜测是错误的......
class __declspec(uuid("4C41678E-887B-4365-A09E-925D28DB33C2")) msdia90;
hr = CoCreateInstance(__uuidof( msdia90 ),
所以,我完全迷失了。为什么dia2dump.exe无法在下载的mfc90.pdb文件上运行?