在64位Windows机器上运行32位应用程序使用32位COM的方法

3
我有一个使用C++ COM对象和C#应用程序,两者都是在32位机器上构建的。现在我需要在64位机器上运行它们。我已经注册了COM对象,在计算机 \ hkey_classes_root \ wow6432node \ clsid {xxx} 下创建了相应的条目。 然而,当我尝试运行应用程序时,它显示“检索组件CLSID {xxx}的COM类工厂失败,原因是以下错误:80040154。”。据我所知,该错误代码意味着该类未注册。 请帮助我!!! 谢谢
4个回答

4
上面的第一个答案是正确的答案。如果引用32位COM组件,则无法在64位Windows上运行CPU ANY目标应用程序。它将无法加载。
正在发生的是JIT看到了CPU ANY并将您的应用程序升级为64位。但是没有64位版本的com控件,因此您会收到未注册错误。
对于使用Microsoft Access作为其数据库的人来说,这是一个大问题。Access没有64位版本,因此当他们看到错误时,他们认为需要64位运行时(不存在)。您必须将应用程序标记为仅32位才能使用Access运行时。
这是一个不好的选择(在我看来)-找到一个有64位版本的更好的组件,或者完全使用托管代码。
我不喜欢将应用程序标记为仅32位,除非他们确实需要它。

首先,非常感谢!我已经将应用程序重建为x86并找到了com对象。现在我想知道是否应该将其依赖的所有库也重建为x86。仅构建x86配置的应用程序是否足够,还是所有依赖项都应该作为x86构建? 再次感谢! - Vicky
1
通常情况下,运行的应用程序域(主应用程序)将决定应用程序的位大小。如果您的主要应用程序是x86,则JIT通常不会将您下面的任何内容提升到64位。但是,这取决于您如何加载它。为了安全起见,您可能希望将它们全部标记为x86。 - Jason Short

2
C#应用程序可能是使用Any CPU目标编译的,在x64机器上以64位模式运行。64位进程无法访问32位进程。
在Visual Studio中,您可以强制将其编译为仅限32位的应用程序。它在项目属性,生成选项卡,平台目标下拉菜单中。将其设置为x86
可能有其他方法可以强制将其作为32位应用程序运行,但我不熟悉。

2

.NET运行时自动以64位运行应用程序,因此无法将32位COM组件加载到其进程中。

如果COM组件具有自动化兼容接口,则非常容易解决。创建一个COM+应用程序(控制面板->管理工具->组件服务),并将组件添加到其中。这样,您将强制在单独的进程中创建组件,并且不再需要担心客户端应用程序作为64位应用程序运行。


0

我认为你不能在64位机器上本地运行32位应用程序。你需要将应用程序编译为64位二进制文件或在模拟器下运行它(例如Windows上的WOW64)。如果你的应用程序(构建在64位二进制文件中)使用任何外部dll,你还需要所有这些dll的64位版本。

这是一个很好的参考:

http://searchwindowsserver.techtarget.com/tip/0,289483,sid68_gci1220022,00.html

编辑:

如果您进入项目属性 -> 构建,将平台目标从“任何 CPU”更改为 X86。看看这是否有帮助。

或者您需要注册您的 DLL:http://riteshk.blogspot.com/2007/05/retrieving-com-class-factory-failed-due.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接