c# - 在 Vista 64 位上使用来自 C# 或 VBS 的 32 位 COM 对象并出现错误 80004005

标签 c# .net com 64-bit wsh

我需要在这里读心术,因为我正在尝试做我不完全理解的事情。

有一个 32 位应用程序(称为 CQG 的电子交易应用程序)提供了一个 COM API 供外部访问。我有从 Excel、.NET(C++、VB 和 C#)和 shell VBScript 访问此 API 的示例程序和脚本。我将这些 .NET 应用程序作为源代码和编译后的可执行文件(32 位,在 Windows XP 上编译)。

现在我有了 Windows Vista Home 64 位,这让我头晕目眩。 Excel 示例工作正常(在 Excel 2003 中)。已编译的 .NET 示例可执行文件也可以正常工作。

但是,当我尝试运行由 Visual Studio C# Expression 转换和编译的 .NET C# 示例,或运行 VBScript 脚本时,我在尝试创建对象时收到错误 80004005。最初 .NET 应用程序也给了我 80040154 但后来我想出了如何让它生成 32 位代码而不是 64 位代码,所以现在 C# 和 VBScript 应用程序中的错误是相同的。这就是我目前取得的所有进展。

是的,我尝试从我的 VBS 上的 SysWOW64 文件夹运行 32 位版本的 cscript.exe/WScript,但结果仍然相同 (80004005)。

如何解决这个问题?我几乎已经准备好相信这实际上是不可能的,但是 Excel VBA 可以工作并且在 Windows XP 上编译的 .NET 可执行文件运行良好这一事实让我很生气。应该有办法解决这个问题(一些可能只有 Windows Vista 开发人员知道的 secret )!我将不胜感激任何帮助!

PS:我相信代码示例在这里没有多大意义,但这是失败的 VBScript 行:

Set CEL = WScript.CreateObject("CQG.CQGCEL.4.0", "CEL_")

这是 C#:

CQGCEL CEL = new CQGCEL();

更新:忘了说UAC当然是关闭的。我正在使用具有管理员权限的帐户工作。

我还尝试使用 Process Monitor 查看读取了哪些注册表项,但该对象的 GUID 看起来一切正常。我无法识别其他一些 GUID,所以我不确定它们是否重要。

这个 COM 对象是否有可能使用 Internet Explorer 并得到错误的(比如 Internet Explorer 7 而不是 Internet Explorer 6 引擎或其他东西)?

最佳答案

对于 64 位机器,您必须记住许多事项。这些是过去让我感到困惑的一些事情。

  1. .NET 中的任何 CPU 构建方法 它将在 64 位上以 64 位运行 机器。
  2. 很多 COM 组件 似乎只有 32 位(我知道这个 是一种概括,但通常是 案子)。为了使用它们,你 需要将您的应用程序构建为 32 位(x86)。
  3. 64 位 Windows 有 不同的 32 位和 64 位注册表 节点。例如,如果你运行 regedit 为 64 位,你会看到 HKLM\Software\Wow6432Node 和 HKCU\Software\Wow6432Node.这 包含 32 的所有信息 位应用。

我的建议是构建一个 32 位应用程序,看看会发生什么。

关于c# - 在 Vista 64 位上使用来自 C# 或 VBS 的 32 位 COM 对象并出现错误 80004005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396933/

相关文章:

c# - 处理从主窗口中的模态对话框引发的冒泡事件

c# - 知道 DLL 在什么上下文中运行

c++ - 如何为 Internet Explorer 创建扩展作为 Exe Com 服务器?

c# - 带有新属性的 LINQ 继承 "Down-Cast"

c# - [ComVisible] 默认和公共(public)类 COM 公开有什么关系?

c++ - 奇怪的双指针空检查

c# - 在列表框中查看项目

c# - 按位或组合

c# - 将 String 转换为 DateTime 时出错。 "String was not recognized as a valid DateTime."

.net - Thread.Start() 与 BackgroundWorker