64位系统上的32位Com服务器

时间:2010-10-21 09:27:56

标签: c++

我开发了一个Com服务器和Windows XP 32位。为了测试Com服务器,我使用C#创建了一个Client,通过Interop调用函数。 一切正常,但现在我需要让ComServer在Windows 7 64位系统上运行。 我将ComServer DLL和C#EXE带到了64位计算机,用regsrv32注册了ComServer DLL并启动了C#程序。 我首先尝试访问ComServer功能,我得到的是错误:

  

System.Runtime.InteropServices.COMException(0x80040154):Die COM-KlassenfactoryfürdieKomponente mit CLSID {BA4D7F46-A47E-4CB9-A153-2B4657C4DD29} konnte aufgrund des folgenden Fehlers nicht abgerufen werden:80040154。

英文:

  

System.Runtime.InteropServices.COMException(0x80040154):由于错误:80040154,无法调用具有CLSID {BA4D7F46-A47E-4CB9-A153-2B4657C4DD29}的组件的COM-Classfactory。

这里出了什么问题?是不是可以在64位系统上调用32位DLL?如果是,所有其他32位程序如何工作?

问候 camelord

2 个答案:

答案 0 :(得分:1)

您无法将32位库加载到64位进程中,反之亦然 - 库和进程必须具有相同的位数。

最好的解决方案是获得64位版本的COM服务器库。如果这不可能(这很常见),您有两种选择:

  • 使消费程序为32位(可能你必须在Visual Studio中将目标从“任何CPU”更改为“x86”)
  • 强制COM服务器进入代理进程(使用COM +)。

在第一种情况下,您将程序和COM服务器都设置为32位,因此COM服务器库可以正常加载。在第二种情况下,COM +创建一个32位代理进程并将库加载到其中,您的程序通过RPC与该进程通信,因此您不必关心位数差异。

两种选择都有缺点。在第一种情况下,即使在64位系统上也可以使程序32位。在第二个阶段,由于进程间通信而遇到开销。

答案 1 :(得分:0)

来自here

corflags与/ 32bit +开关一起使用,让应用程序以32位模式运行

  

CorFlags.exe程序集[选项]