在多个线程中调用RegisterClassObjects和ResumeClassObjects?

时间:2017-04-05 21:29:22

标签: interface com atl

我有一个C ++ COM服务器,它使用第三方dll,它也暴露了一个COM接口。第三方dll是旧的(使用Visual Studio 6构建),因此它使用旧的ATL代码。我有这个dll的来源。

我正在使我的应用程序工作为32位和64位,因此我需要更新第三方dll以使其与我的64位应用程序一起运行。当然,在最近的Visual Studio版本中不支持旧的ATL代码,因此我必须对其进行修改。我基本上做了一个改变 - dll中的模块来自旧的CComModule。我将其更改为CAtlExeModuleT<>。我得到了这个工作,所以第三方dll公开的COM接口正常工作,但现在我的应用程序的COM接口都不可见。

从第三方dll(在一个线程中)和从我的应用程序(在不同的线程中)调用CoRegisterClassObjects()和CoResumeClassObjects()。我没有从这些错误中获得任何错误......但这是一个有效的方案吗?

如果我没有从第三方dll调用CoRegisterClassObjects()和CoResumeClassObjects(),我的应用程序的COM接口是可见的。

所以似乎一个人隐藏了另一个人。但是,使用Visual Studio 6构建的第三方dll可以正常工作。

是否有任何理由只能看到一组接口?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。事实证明,最新版本的ATL仍支持CComModule类。不幸的是,我无法回忆起让我改变我正在使用的课程的所有细节。但是CComModule :: Init()方法就是其中之一。它没有传入第三个可选的GUID参数。也许较旧的Visual Studio 6 ATL代码有另一种获取此值的方法。较新的ATL代码没有获得价值。我添加了参数,事情又开始了。

相关问题