开发环境:
目标环境:
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?
答案 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也是。