使用 SysWow64\Regsvr32 注册 32 位 DLL 会生成不同的 CLSID,然后会出现错误消息

Registering a 32bit DLL with SysWow64\Regsvr32 generates a different CLSID, then an error message

开发环境:

目标环境:

VB6 应用程序 (app.exe) 依赖于 COM 可见的 .NET DLL (netdll.dll),它本身依赖于 Visual Basic 6 生成的 COM DLL(一个包装器来处理ListBox 对象,我们称它为 vb6dll.dll).

都是32位的,因为devos是32位的,上面说了。我还使用 Cygwin 提供的 file 命令检查了它们:

amessihel@aselkim:~> file path/to/app.exe
path/to/app.exe: PE32 executable (GUI) Intel 80386, for MS Windows

amessihel@aselkim:~> file path/to/netDLL.dll
path/to/netdll.dll: PE32 executable (DLL) (GUI) Intel 80386 Mono/.Net assembly, for MS Windows

amessihel@aselkim:~> file path/to/vb6.dll
path/to/vb6.dll: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows

RegAsm 用于注册 netdll.dll :

amessihel@aselkim:~> /cygdrive/c/Windows/Microsoft.NET/Framework/v4.0.30319/RegAsm ./netdll.dll /codebase /tlb:netdll.tlb

SysWow64\RegSvr32用于在目标环境中注册vb6dll.dll

amessihel@aselkim:~> /cygdrive/c/Windows/SysWOW64/regsvr32.exe ./vb6dll.dll

当我启动 VB6 应用程序时,我收到以下消息:

Retrieving the COM class factory for component with CLSID {XXXX} failed due to the following error: 80040154

我认为它不是 this question 的副本。我发现 vb6dll.dll 的 CLSID 从 Windows 2008 更改为 Windows 2012 R2... 这似乎是为什么 netdll.dll 找不到...如果是这样,为什么注册会这样?

更新:我承认我是个 CLSID 东西的新手...如果我理解清楚的话,VB6 会为每个 COM 对象自己编写 CLSID,然后检索这些 CLSID通过 RegSvr32。如果为真,为什么 Windows 2012 版的 RegSvr32 (SysWow64) 在注册表中写入另一个 CLSID?

已解决。 CLSID 写在 DLL 内部。改编 a piece of code found here to write a small appli retrieving the CLSID for a DLL. I found out my DLL wasn't identical, y.

TL;DR : 如果 CLSID 改变,DLL 也会改变。