c++ - RegisterClassObjects() 找不到要注册的类

标签 c++ visual-studio-2008 com atl visual-c++-6

我正在将应用程序从 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 更改为RunningRegisterClassObjects 返回 S_FALSE(实际上是一条警告消息),因为:

  • 之前的开发人员启用了 COM(_ATL_NO_COM_SUPPORT 被定义)
  • *.EXE 中没有定义 COM 对象

调用堆栈

  • 第 8192 行:*ppEntry 始终为 NULL
  • AtlComModuleRegisterClassObjects
  • CAltExeModule.RegisterClassObjects
  • CAtlServiceModuleT.PreMessageLoop
    • 如果 RegisterClassObjects 未返回 S_OK,则服务状态未更新为Running

后续步骤

您可以使用的选项取决于您的情况。为什么调用 RegisterClassObjects?为什么没有检测到 COM 对象?

以我为例:

  1. 我无法阻止 RegisterClassObjects 被调用
  2. 我不想通过引入 _ATL_NO_COM_SUPPORT 来禁用 COM,因为我没有完全理解对我一无所知的应用程序进行此类更改的影响
  3. 我不想修改 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/

相关文章:

C++ 我应该如何返回我的字节数组?

c++ - 对使用 operator new 的放置 delete 的结果调用 delete 好吗?

C++:如何切换参数?

visual-studio - Visual Studio : How to make one solution depend on another?

vb.net - 不使用下划线隐藏成员

c# - 我如何在 C++ 中使用 ArrayList?

c++ - 令人惊讶的基准测试结果

c++ - 访问宏中的变量值

visual-studio-2008 - Entity Framework 4 Visual Studio 2008

c++ - 如何为虚函数设置对齐方式?