4

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

有一个 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# 表达式并由其编译的 .NET C# 示例或运行 VBScript 脚本时,尝试创建对象时出现错误 80004005。最初 .NET 应用程序也给了我 80040154 但后来我想出了如何让它生成 32 位代码而不是 64 位代码,所以现在 C# 和 VBScript 应用程序中的错误是相同的。这就是我目前取得的所有进展。

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

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

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 引擎或其他东西)?

4

3 回答 3

2

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

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

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

于 2008-12-29T07:12:43.013 回答
1

问题可能是 DEP。

我遇到了和你完全相同的问题,并从 CQG 的技术支持那里得到了一些帮助。Windows Vista 和 Windows 7 默认开启数据执行保护。您可以使用具有管理员权限的命令提示符将其关闭

bcdedit.exe /set {current} nx AlwaysOff

稍后,如果需要,可以使用

bcdedit.exe /set {current} nx AlwaysOn

不会提示重新启动,但这是必要的。您可以使用检查您的 DEP 策略

wmic OS Get DataExecutionPrevention_SupportPolicy

其中0is Always off, 1is Always On, 2is Opt in(和默认值), 3is Opt Out.

将我的更改为 Always Off 并重新启动后,我能够编译而不会抛出 80004005 错误。

于 2010-08-20T02:14:14.123 回答
0

您可以尝试一些有用的事情:

  1. 运行进程监视器,并将输出过滤到失败的进程。查看是否报告了任何奇怪的错误。

  2. 同样,尝试在非托管调试器下运行并查看是否抛出任何其他第一次机会异常。这也可以让您确认是否正在将 inproc COM dll 加载到进程中。

  3. 尝试关闭 UAC 并查看会发生什么。

于 2008-12-29T02:21:58.017 回答