2008-12-29 31 views
4

我需要在这里读一些思想,因为我正在尝试做我不完全理解的内容。在Vista 64位上使用来自C#或VBS的32位COM对象并获取错误80004005

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

现在我有Windows Vista Home 64位,这让我的脑子旋转。 Excel示例工作得很好(在Excel 2003中)。编译的.NET示例可执行文件也可以工作。

但是当我试图运行.NET C#示例转换为Visual Studio C#Expression并编译时,或者运行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引擎或其他东西)?

+0

你有没有想过这个? – 2009-03-26 16:43:20

回答

3

有一些事情你必须记住一个64位机器。这些都是过去让我感动的事情。

  1. 建筑用于.NET任何CPU意味着 它将运行64位64位 机器上。
  2. 很多COM组件 似乎只有32位(我知道这个 是泛化,但通常是 的情况)。为了使用它们,您需要将您的应用程序构建为位(x86)32 位(x86)。
  3. 64位Windows具有 不同32和64位的注册表 节点。例如,如果您运行注册表编辑器 64位,你会看到 HKLM \ SOFTWARE \ Wow6432Node和 HKCU \ SOFTWARE \ Wow6432Node。该 包含32位应用程序的所有信息。

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

0

一对夫妇有用的东西,你可以尝试:

  1. 运行process monitor与过滤,以失败进程中的输出。看看是否有任何奇怪的错误报告。

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

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

+0

已更新关于UAC和Process Monitor。 – alexandroid 2008-12-29 02:41:41

+0

我不知道我明白什么非托管调试器或VS Express有它。 = \ – alexandroid 2008-12-29 02:44:19

1

问题可能是DEP。

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

bcdedit.exe /set {current} nx AlwaysOff 

管理员权限之后将其关闭,如果你需要,你可以用

bcdedit.exe /set {current} nx AlwaysOn 

重启重新开启不提示,但是是必要的。您可以检查使用

wmic OS Get DataExecutionPrevention_SupportPolicy 

您的DEP策略,其中0Always off1Always On2Opt in(和默认值),3Opt Out

将我的地雷改为Always Off并重新启动后,我能够编译而不会丢失80004005错误。