尝试追踪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>
答案 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}}。
为什么这样做,是另一个问题!