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

时间:2016-01-07 13:37:25

标签: .net com vb6 dllregistration syswow64

开发环境:

  • Windows 2008 Server 32位
  • Visual Studio 2010 Professional
  • Visual Basic 6

目标环境:

  • Windows 2012 R2 64位

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

如上所述,所有这些都是32位,因为dev os是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应用程序时,我收到了这条消息:

  

由于以下错误,检索CLSID为{XXXX}的组件的COM类工厂失败:80040154

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

更新:我承认我是CLSID新手的新手...如果我清楚地理解它,VB6会为每个COM对象写入自己的CLSID,并且RegSvr32会检索这些CLSID。如果为true,为什么Windows 2012版本的RegSvr32(SysWow64)会在注册表中写入另一个CLSID?

1 个答案:

答案 0 :(得分:0)

解决。 CLSID写在DLL中。改编a piece of code found here以编写一个小应用程序,检索DLL的CLSID。我发现我的DLL并不相同,because it was command-line generated without binary compatibilit y。

TL;DR :如果CLSID发生变化,那么DLL也是。