2011-03-15 101 views
0

我有一个32位的COM服务器DLL,需要从32位和64位应用程序中使用它。我可以创建一个COM +服务器应用程序,然后COM服务器将在代理过程中实例化。一旦我将COM服务器添加到COM +服务器应用程序中,我不能再在-proc中实例化它 - 为什么?

问题是我不能再实例化它作为一个进程内服务器(CLSCTX_INPROC_SERVER标志传递给CoCreateInstance()) - 我得到“类未注册”。这不太好,因为现在即使是32位应用程序也需要与代理进程交谈,这增加了不必要的编组开销。

如何设置一个COM +服务器应用程序,使得相同位数的客户端仍然可以使用COM服务器in-proc?

+0

这是一个有点痛苦的事情,我做了一次,但我忘了如何。抱歉!我认为所有这一切都是创建一个AppID,然后转到Wow6432Node \ AppID并在那里添加“DLLSurrogate”空字符串值。尽管你可能需要复制clsid条目。 – Ben 2011-03-15 13:43:00

+0

COM +让我想起了Zawinski对正则表达式的评论,“现在你有两个问题”。本的建议很好。 – 2011-03-15 14:01:50

回答

0

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

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

+0

他已经这样做了,现在他有一个不同的问题,即32位应用程序也在使用代理过程。他希望32位应用程序实例化它,而64位应用程序使用代理。 – Ben 2011-03-15 13:41:18

+0

最简单的解决方法是使用COM + - 无代码,只需点击几次鼠标即可。 – sharptooth 2011-03-15 13:52:04

0

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