我可以使用来自 64 位进程的 32 位 COM 对象,反之亦然吗?

Can I use 32-bit COM objects from 64-bit process, or vice-versa?

所以在工作中我们有大量遗留组件,COM 对象用 32 位 VB6 编写并通过 VBScript 调用,我被分配了维护和更新它们的出色工作。我以前从未深入研究过 COM,但不管我如何设置,并尝试 运行 一个脚本。我收到以下错误:

"Microsoft VBScript runtime error: ActiveX component can't create object: 'OurDLL.clsMyObj'"

行中出现错误:

Set myObj = CreateObject("OurDLL.clsMyObj")

该脚本在 32 位 CMD 中运行良好,但在 64 位 CMD 中运行不佳,因此我有理由相信这是一个体系结构问题。我喜欢使用 Cygwin 进行编辑和测试;我可以使用两个不同的版本,但如果可以的话,我想避免同时配置两个版本的麻烦。

所以,问题是:

这取决于您使用的是什么以及它是如何被调用的。

我已经看到尝试绑定到 32 个对象的脚本语言存在兼容性问题(例如 cygwin 64 python 试图使用 32 位 oracle 驱动程序)。

就像 vbs 或 shell 脚本这样的命令行脚本而言,应该没有任何区别。 IOW,如果您可以在 CMD 中执行命令,那么您应该能够在 Cygwin 中执行它。

在某些情况下,我看到 windows 实际上会提供两种不同的 32/64 命令来执行某些操作。在这些情况下,您必须指定可执行文件的完整路径。

我的猜测(我不确定)是您可能需要将 vbs 解释器的完整路径指定为 32 位。

默认情况下 Windows 启动与父进程类型匹配的脚本解释器(如果父进程是 32 位,则为 32 位解释器;如果父进程是 64 位,则为 64 位解释器).如果您的 Cygwin shell 是 64 位的,您需要在 32 位解释器中显式启动您的 VBScript:

  • C:\Windows\SysWOW64\cscript.exe //NoLogo "C:\path\to\your.vbs"
  • C:\Windows\SysWOW64\wscript.exe //NoLogo "C:\path\to\your.vbs"

如果您希望调用在 32 位和 64 位安装之间可移植,我将定义一个启动函数,如下所示:

function RunVBS32 {
  if [ -f "C:\Windows\SysWOW64\cscript.exe" ]; then
    "C:\Windows\SysWOW64\cscript.exe" //NoLogo ""
  else
    "C:\Windows\cscript.exe" //NoLogo ""
  fi
}