0

开发环境:

  • 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?

4

1 回答 1

0

解决。CLSID 写在 DLL 中。改编了此处找到的一段代码,以编写一个检索 DLL 的 CLSID 的小应用程序。我发现我的 DLL 并不相同,因为它是在没有二进制兼容性的情况下生成的命令行

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

于 2016-01-07T16:26:58.043 回答