Com GUID/ProgId/CLSID混淆

Com GUID/ProgId/CLSID混淆,com,guid,uuid,Com,Guid,Uuid,试图追踪COM问题,我正在调试代码,似乎看到相同的GUID以不同的方式表示 我的代码中有一行: class\uu declspec(uuid({d4f8347-E58E-11d1-9D47-006008098294})) 和各种注册表信息,然后调用: CLSID clsid; ::CLSIDFromProgID("myProgId",&clsid); 在调试器中,clsid显示为{000AFC9A-3347-D4F8-8EE5-D1119D470060}。对我来说,这太相似了,不可能不

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

我的代码中有一行:
class\uu declspec(uuid({d4f8347-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(…)
的问题与此无关。

在已经有guid的情况下使用CLSIDFromProgID()没有多大意义。函数在注册表中查找以将“ProgId”字符串映射到CLSID{guid}。这当然使正确注册progid变得很重要。听起来确实不是。当类已经用
\uuu declspec(uuid)
修饰时,只需使用来检索guid


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

“\uuuu declspec(uuid)”只是标识符与您的类的关联,没有其他关联。使用
CLSIDFromProgID
API,您可以使用系统注册表中的注册信息将ProgID解析为CLSID。也就是说,这两者不必匹配。但是,如果您做得很整洁,并且您的COM类使用相同的标识符注册,它们通常会匹配在一个测试中,当发现一个被附加到C++类的源代码中时,发现了问题是,VisualC++调试程序是如何显示值的,没有更多的。例如注册表值是代码< > D4F8334—E58E-11D1-9D44-0600 809894}< <代码>,调用<代码> >:代码> >代码> CLSID.PROFIDID的结果。()给出
{D4F83347-E58E-11d1-9D47-006008098294}
-但在调试器中,MSVC++将变量显示为
{000AFC9A-3347-D4F8-8EE5-D1119D470060}


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

这也是我们在reg脚本中呈现它的方式。例如,我检查了注册表和
HKEY\U类\u ROOT\myProgId\CLSID={D4F83347-E58E-11d1-9D47-006008098294}
即,与我从代码中发布的格式相同。因此,它似乎注册正确,但随后以另一种格式返回。仅供参考,我们使用ProgID作为字符串动态加载内容,但它是一个大型旧客户机-服务器系统,其起源在历史中丢失:)好的,只需查看Regedit.exe并检查其中写入的实际值。如果不匹配,则可能忘记重新注册DLL,或者您将不得不调试您的注册代码。根据我之前的评论,这是来自Regedit的。这是我们在此处使用的格式,但MSVC++调试器显示
CLSIDFromProgID()的结果
以这种其他格式。实际上-这可能仅仅是调试器如何显示guid的问题吗?我不知道,从来没有听说过出现这种错误。如果您使用autoexp.dat蒙骗,任何事情都是可能的。调试器在注册表中查找,尝试使用
CLSID\{guid}的默认值将CLSID映射到名称
键。我没有什么可以帮助您诊断的。从一些测试来看,似乎是MSVC++在调试器中显示GUID的方式导致了问题-如果我调用
::StringToCLSID()
值,它将采用预期的格式。这有点像曲线球!