2009-11-16 146 views
1

我正在将应用程序从Visual Studio C++ 6.0转换为Visual Studio 2008,并遇到ATL问题。RegisterClassObjects()找不到要注册的类

我一直有一大堆问题,但这是第一个在两个不同编译器之间返回值不同的调用。

下面一行用VC++ 6.0编译时,返回S-OK。在VS 2008中运行时,它返回S-FALSE。根据MSDN文档,这意味着它找不到任何要注册的类。

_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE) 

任何帮助将不胜感激。谢谢!

+0

这种方法属于ATL。 ATL作为完整的资料来源出货。您可以按“进入”并调查问题。 – sharptooth 2009-11-17 06:43:51

+0

是的,我一直这样做,但没有多少来自它。 我一直在浏览VC++ 6.0编译版本,并将名为/ returns values的函数与VS2008的函数进行比较。函数和参数大部分是相同的,但我一直无法弄清楚如何使用所需的参数调用新函数。 在这一点上,我已经决定自己被困在COM的肠子很长一段时间...... ::叹息:: – RunOfTheShipe 2009-11-19 03:34:49

回答

1

我也遇到了与RegisterClassObjects相关的问题,意外返回S_FALSE。在我的场景中,服务状态不会从开始在传统的C++/ATL/COM项目中运行RegisterClassObjects返航S_FALSE(有效的警告信息),因为:

  • 以前的开发已使COM(_ATL_NO_COM_SUPPORT被定义)
  • 没有COM对象已被内*.EXE
定义

CALL STACK

  • 线8192:*ppEntry总是NULL
  • AtlComModuleRegisterClassObjects
  • CAltExeModule.RegisterClassObjects
  • CAtlServiceModuleT.PreMessageLoop
    • 如果RegisterClassObjects没有返回S_OK,那么服务状态没有更新为运行

下一步

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

在我的情况:

  1. 我不能阻止RegisterClassObjects被称为
  2. 我不想通过引入_ATL_NO_COM_SUPPORT禁用COM,因为我没有完全理解做出这样的改变所带来的影响一个应用程序我也不知道,
  3. 我不想修改SDK与if (SUCCEEDED(hr))
更换

所以我保证AtlComModuleRegisterClassObjects能够找到在汽车地图一个有效的COM对象(这是由pComModule->m_ppAutoObjMapFirst参考)

背景

  • 的Visual Studio 2013
  • 的Windows SDK 7.1A
  • 活动模板库版本12.00

个参考

鉴于我知之甚少COM & ATL,我发现这种说法是一个真正的大开眼界:

ATL服务旨在服务于COM对象。您未能在对象图中提供 任何对象。从技术上讲,ATL的工作更好 - 它检测到没有对象可供使用,所以根本没有必要启动服务......故障是你的 - 因为使用不支持的方式在 中使用ATL。这就是说然而,这是非常简单的去除 函数调用登记的对象...

[来源:ATL Services and 2003]

+0

这是一个问题或答案?事实上,你应该重写'PreMessageLoop',以便没有启动ATL COM服务器的服务器。 – 2015-04-22 15:34:55

相关问题