注册COM时Clsid从何而来

Where Clsid comes from when registering COM

当我在 CMD 中通过 运行 regsvr32 MyCOMdll.dll 注册 COM dll 时,我看到在注册表中创建了几个条目,其中之一是:

[HKEY_CLASSES_ROOT\MyCOMdll.MyClass\Clsid]
@="{DB402D5A-5584-4F68-A750-45D3E8133121}"

我想了解 DB402D5A-5584-4F68-A750-45D3E8133121 的来源,最初我认为 GUID 是在您注册此 DLL 时生成的,但是我在不同的环境中检查了它,发现它具有相同的值。看起来这些 GUID 已嵌入到 DLL 中,但我无法确认或找出具体位置。

上下文: 我想执行该 COM 的 "hot swap",但它似乎并不简单。我尝试在注册新 DLL 后更新注册表中的 GUID,但出现错误 ClassFactory cannot supply requested class

当您使用 regsvr32 注册 COM dll 时,CLSID 是在 dll 中定义的。

在典型的 ATL COM 项目中,这些条目在 *.rgs 文件和 registry is updated based on that content 中指定。当然,这不是唯一的方法,其他工具集和技术也有不同的方法。

这些CLSID实际上是在项目的.idl文件中定义的(同样,这对库中所有COM类型的ATL projects), and .rgs file must correctly match the values. The .idl file itself contains IDL定义有效,并且被MIDL编译器用来生成类型库.