在Vista 64位上使用C#或VBS中的32位COM对象,出现错误80004005

在Vista 64位上使用C#或VBS中的32位COM对象,出现错误80004005,c#,.net,com,64-bit,wsh,C#,.net,Com,64 Bit,Wsh,我需要一些读心术,因为我正在尝试做我不完全理解的事情 有一个32位应用程序(称为CQG的电子交易应用程序),它为外部访问提供COM API。我有从Excel、.NET(C++、VB和C#)和shell VBScript访问此API的示例程序和脚本。我将这些.NET应用程序作为源代码和编译的可执行文件(32位,在Windows XP上编译) 现在我有了64位的WindowsVista Home,这让我头晕目眩。Excel示例工作得很好(在Excel 2003中)。编译的.NET示例可执行文件也可以

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

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

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

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

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

如何解决这个问题?我几乎准备好相信这实际上是不可能的,但Excel VBA工作正常,在Windows XP上编译的.NET可执行文件运行正常这一事实让我很生气。应该有一种方法来击败这件事(一些可能只有WindowsVista开发者知道的秘密)!我将感谢任何帮助

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

Set CEL = WScript.CreateObject("CQG.CQGCEL.4.0", "CEL_")
这是C#:

更新:忘了说是关了,当然。我是通过管理员权限的帐户工作的

我还尝试使用Process Monitor查看哪些注册表项被读取,但对于这个对象的GUID,一切看起来都正常。我无法识别其他一些guid,因此我不确定它们是否重要


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

您可以尝试一些有用的方法:

  • 运行时将输出过滤到失败的进程。查看是否报告了任何奇怪的错误

  • 类似地,请尝试在非托管调试器下运行,并查看是否引发了任何其他首次出现的异常。这还将允许您确认inproc COM dll是否正在加载到进程中

  • 试着关掉UAC,看看会发生什么


  • 对于64位机器,您必须记住许多事情。这些都是过去让我抓狂的事情

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

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

    问题可能是DEP

    我和你有完全相同的问题,并从CQG的技术支持部门得到了一些帮助。默认情况下,Windows Vista和Windows 7将启用数据执行预防。您可以在具有管理员权限的命令提示符下使用

    bcdedit.exe /set {current} nx AlwaysOff
    
    稍后,如果需要,可以使用重新打开

    bcdedit.exe /set {current} nx AlwaysOn
    
    不会提示重新启动,但这是必要的。您可以使用检查您的DEP策略

    wmic OS Get DataExecutionPrevention_SupportPolicy
    
    其中
    0
    始终关闭
    1
    始终打开
    2
    选择加入
    (以及默认值),而
    3
    选择退出


    将我的更改为“始终关闭”并重新启动后,我能够在不抛出80004005错误的情况下进行编译。

    更新了UAC和Process Monitor。我不确定我是否理解非托管调试器是什么,或者VS Express是否有它=\谢谢是的,这就是我所做的,我的C#应用程序构建为32位(x86)。进程监视器显示从Wow6432Node分支发出的请求。您知道这一点吗?
    wmic OS Get DataExecutionPrevention_SupportPolicy