我正在将应用程序从 Visual Studio C++ 6.0 转换为 Visual Studio 2008,但遇到了 ATL 问题。
我遇到了一大堆问题,但这是两个不同编译器之间返回值不同的第一个调用。
以下行在使用 VC++ 6.0 编译时返回 S-OK。在 VS 2008 中运行时,它返回 S-FALSE。根据 MSDN 文档,这意味着它找不到任何要注册的类。
_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE)
如有任何帮助,我们将不胜感激。谢谢!
最佳答案
我也遇到了与 RegisterClassObjects
意外返回 S_FALSE
相关的问题。在我的场景中,在遗留 C++/ATL/COM 项目中,服务状态并未从Starting 更改为Running。 RegisterClassObjects
返回 S_FALSE
(实际上是一条警告消息),因为:
- 之前的开发人员启用了 COM(
_ATL_NO_COM_SUPPORT
未被定义) *.EXE
中没有定义 COM 对象
调用堆栈
- 第 8192 行:
*ppEntry
始终为 NULL AtlComModuleRegisterClassObjects
CAltExeModule.RegisterClassObjects
CAtlServiceModuleT.PreMessageLoop
- 如果
RegisterClassObjects
未返回S_OK
,则服务状态未更新为Running
- 如果
后续步骤
您可以使用的选项取决于您的情况。为什么调用 RegisterClassObjects
?为什么没有检测到 COM 对象?
以我为例:
- 我无法阻止
RegisterClassObjects
被调用 - 我不想通过引入
_ATL_NO_COM_SUPPORT
来禁用 COM,因为我没有完全理解对我一无所知的应用程序进行此类更改的影响 - 我不想修改 SDK,将
if (FAILED(hr))
替换为if (SUCCEEDED(hr))
所以我确保 AtlComModuleRegisterClassObjects
能够在自动映射中找到有效的 COM 对象(由 pComModule->m_ppAutoObjMapFirst
引用)
语境
- Visual Studio 2013
- Windows SDK 7.1A
- 事件模板库版本 12.00
引用文献
鉴于我对 COM 和 ATL 知之甚少,我发现这个陈述真的让我大开眼界:
ATL Services are designed to serve COM objects. You failed to provide any objects in the object map. Technically, ATL is working even better - it detects there are no objects to serve, so there's no point in starting the service at all... The fault is yours - for using ATL in an unsupported way. This said however, it's very simple to remove the function call registering the objects...
[SOURCE: ATL Services and 2003]
关于c++ - RegisterClassObjects() 找不到要注册的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1743087/