GUID / ProgId / CLSID混淆

时间:2012-11-16 11:06:01

标签: com guid uuid

尝试追踪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(...)上的问题与我无关。< / p>

3 个答案:

答案 0 :(得分:1)

当你已经拥有guid时使用CLSIDFromProgID()没有多大意义。该函数在注册表中查找以将“ProgId”字符串映射到CLSID {guid}。当然,正确注册progid很重要。当然听起来不是。如果您的课程已经使用__declspec(uuid)进行了修饰,那么只需使用__uuidof() operator来检索guid。

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

答案 1 :(得分:1)

“__ declspec(uuid”只是标识符与您的类的关联,没有别的。使用CLSIDFromProgID API您正在使用系统注册表中的注册信息将ProgID解析为CLSID。也就是说,这两者不是必须匹配。它们通常匹配,但如果你做得很干净,你的COM类注册时的标识符与源代码中附加到C ++类的标识符相同。

答案 2 :(得分:0)

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

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