0

试图追查 COM 问题,我正在调试我的代码,似乎看到相同的 GUID 代表不同的方式......

我的代码中有一行: class __declspec(uuid("{D4F83347-E58E-11d1-9D47-006008098294}"))

以及介于两者之间的各种注册表内容,然后调用:

CLSID clsid;
::CLSIDFromProgID("myProgId",&clsid);

在调试器中,clsid 显示为{000AFC9A-3347-D4F8-8EE5-D1119D470060}. 对我来说,这太相似了,不正确,但这不是我可以自动检查的东西……我们有 D4F8 和 3347、9D47,但 E58E 变成了 8EE5 等。

有没有一种方法可以让我理解为什么会发生这种情况,并且有一种方法可以让它们看起来相同以进行比较?

编辑 为了清除一些侧向跟踪,我检查了 Windows 注册表中的 CLSID 和我们的注册脚本{D4F83347-E58E-11d1-9D47-006008098294}- 所以uuid(...)我认为我的问题不相关。

4

3 回答 3

1

当您已经拥有 guid 时使用 CLSIDFromProgID() 没有多大意义。该函数在注册表中查找以将“ProgId”字符串映射到 CLSID {guid}。这当然使得正确注册 progid 很重要。当然听起来不是。当您的类已经被装饰时,__declspec(uuid)只需使用__uuidof() 运算符来检索 guid。

字节值的相似性表明您的注册码已损坏。

于 2012-11-16T13:05:47.850 回答
1

"__declspec(uuid" 只是标识符与您的类的关联,仅此而已。使用CLSIDFromProgIDAPI,您使用系统注册表中的注册信息将 ProgID 解析为 CLSID。也就是说,两者不必匹配。它们通常匹配但是,如果您将所有事情都做得很好,并且您的 COM 类使用与源代码中附加到 C++ 类的标识符相同的标识符进行注册。

于 2012-11-16T13:08:36.737 回答
0

经过一些测试,我发现问题只是可视化 C++ 调试器如何显示值,仅此而已。例如,注册表值为{D4F83347-E58E-11d1-9D47-006008098294},调用给::StringToCLSID()定的结果- 但在调试器中 MSVC++将变量显示为。CLSIDFromProgID(){D4F83347-E58E-11d1-9D47-006008098294}{000AFC9A-3347-D4F8-8EE5-D1119D470060}

为什么会这样,是另一个问题!

于 2012-11-16T16:48:44.230 回答