首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在64位Vista64位操作系统上使用来自C#或VBS的32位COM对象时出现错误80004005

在64位Vista64位操作系统上使用来自C#或VBS的32位COM对象时出现错误80004005
EN

Stack Overflow用户
提问于 2008-12-29 01:12:14
回答 3查看 6.3K关注 0票数 4

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

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

现在我有了64位的Windows Vista Home,这让我头晕目眩。Excel示例工作正常(在Excel2003中)。编译后的.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这行失败的代码:

代码语言:javascript
复制
Set CEL = WScript.CreateObject("CQG.CQGCEL.4.0", "CEL_")

这是C#:

代码语言:javascript
复制
CQGCEL CEL = new CQGCEL();

更新:当然,忘了说UAC已经关闭了。我使用的是具有管理员权限的帐户。

我还尝试使用Process Monitor查看哪些注册表项被读取,但是对于这个对象的GUID,一切看起来都没问题。我无法识别其他一些GUID,所以我不确定它们是否是关键的。

此COM对象是否有可能使用Internet Explorer并获取了错误的Internet Explorer对象(例如Internet Explorer 7而不是Internet Explorer 6引擎或其他引擎)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-29 07:12:43

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-08-20 10:14:14

问题可能出在DEP上。

我和你有完全相同的问题,并从CQG的技术支持中获得了一些帮助。默认情况下,Windows Vista和Windows 7会打开数据执行保护。您可以在命令提示符下使用admin权限将其关闭

代码语言:javascript
复制
bcdedit.exe /set {current} nx AlwaysOff

稍后,如果需要,可以使用以下命令重新打开它

代码语言:javascript
复制
bcdedit.exe /set {current} nx AlwaysOn

系统不会提示重新启动,但必须重新启动。您可以使用以下命令检查您的DEP策略

代码语言:javascript
复制
wmic OS Get DataExecutionPrevention_SupportPolicy

其中0Always off1Always On2Opt in (默认值),3Opt Out

在将我的代码更改为Always Off并重新启动后,我能够在不抛出80004005错误的情况下编译。

票数 1
EN

Stack Overflow用户

发布于 2008-12-29 02:21:58

下面是一些你可以尝试的有用的东西:

  1. 运行process monitor,并将输出过滤到失败的进程。查看是否有任何奇怪的错误,并尝试在非托管调试器下运行,并查看是否引发了任何其他第一次机会异常。这还可以让您确认是否正在将inproc COM dll加载到进程中。
  2. 尝试关闭UAC并查看发生的情况。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/396933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档