当我通过在CMD中运行regsvr32 MyCOMdll.dll
注册COM dll时,我看到在注册表中创建的几个条目,其中一个是:
[HKEY_CLASSES_ROOTMyCOMdll.MyClassClsid]
@="{DB402D5A-5584-4F68-A750-45D3E8133121}"
我想了解DB402D5A-5584-4F68-A750-45D3E8133121
的来源,最初我认为在注册此 DLL 时会生成 GUID,但是我在不同的环境中检查了这一点,我发现它具有相同的值。看起来这些 GUID 嵌入到 DLL 中,但我无法确认或找出在哪一点。
上下文:我想对该 COM 执行"热交换",但这似乎并不简单。注册新 DLL 后,我尝试更新注册表中的 GUID,但收到错误ClassFactory cannot supply requested class
。
当您使用 regsvr32
注册 COM dll 时,CLSID 在 dll 中定义。
在典型的 ATL COM 项目中,这些条目在 *.rgs 文件中指定,并根据该内容更新注册表。当然,这不是唯一的方法,其他工具集和技术以不同的方式做到这一点。
这些 CLSID 实际上是在项目的 .idl 文件中定义的(同样,这对 ATL 项目有效),并且 .rgs 文件必须正确匹配这些值。.idl 文件本身包含库中所有 COM 类型的 IDL 定义,并由 MIDL 编译器用于生成类型库。