一旦我将COM服务器添加到COM +服务器应用程序中,我就无法在进程中实例化它 - 为什么?

时间:2011-03-15 13:13:07

标签: windows visual-c++ com interop com-interop

我有一个32位COM服务器DLL,需要在32位和64位应用程序中使用它。我可以创建一个COM +服务器应用程序,然后COM代理将在代理进程中实例化。

问题是我无法再将其实例化为进程内服务器(传递给CLSCTX_INPROC_SERVER的{​​{1}}标志) - 我得到“类未注册”。这不是很好,因为现在甚至32位应用程序都需要与代理进程通信,这会增加不必要的编组开销。

如何设置COM +服务器应用程序,使得相同位的客户端仍然可以使用进程内的COM服务器?

2 个答案:

答案 0 :(得分:0)

32位DLL只能在32位进程中加载​​,64位DLL只能在64位进程中加载​​(原因是指针大小不同,但也调用约定)。因此,无法在64位应用程序中使用32位进程内服务器DLL中的COM对象,因为系统不会加载DLL。 Windows注册表还有两个不同的视图,一个用于64位应用程序,另一个用于32位应用程序。您的库和32位DLL中的接口和coclass在32位视图中注册,因此它们对64位应用程序不可见,这就是您收到该消息的原因。

您需要一种解决方法,最简单的解决方法是创建一个32位进程外可执行文件,它承载一个包装器COM,它充当前COM对象的代理(或外观)。在您的64位应用程序中,您将使用这个新的包装器。您可以在此处详细了解:http://www.dnjonline.com/article.aspx?id=jun07_access3264

答案 1 :(得分:0)

这可能与COM +有关,它保留了最近激活的对象的缓存。请参阅以下评论this article