开发环境:
- Windows 2008 服务器32 位
- Visual Studio 2010 专业版
- 视觉基础 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 位的。我还file
使用 Cygwin 提供的命令检查了它们:
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
我认为这不是这个问题的重复。我想出了从 Windows 2008 更改为 Windows 2012 R2的 CLSIDvb6dll.dll
......这似乎是为什么netdll.dll
找不到它......如果是这样,为什么注册会这样?
更新:我承认我是 CLSID 的新手......如果我清楚地理解它,VB6 会为每个 COM 对象编写自己的 CLSID,这些 CLSID 由 RegSvr32 检索。如果属实,为什么 Windows 2012 版本的 RegSvr32 (SysWow64) 在注册表中写入另一个 CLSID?