实例化COM对象时出错

时间:2009-06-24 21:51:32

标签: c++ windows com

目前我正在努力尝试在我制作的简单系统上使用COM dll。一切都成功编译,但在运行时CoCreateInstace返回S_OK,但不知何故我的对象指针返回NULL。

此接口指针在我的类标题上创建。最奇怪的是,在方法堆栈上实例化这个相同的指针类型会产生正确的对象,但是在尝试创建BASE com类时,后续调用__hook会打开访问冲突。

可能有用的其他一些方面:

  • 尝试使用CoInitalizeEx运行程序,以COINIT_MULTITHREADED和COINIT_APARTMENTTHREADED开始

  • 该项目是一个使用COM dll的dll

  • 我尝试了相同的方法而没有启动新线程并且错误仍然存​​在

  • 我已经制作了一个测试程序(没有线程,可执行文件),并且正常创建了对象,并正确连接。所以我猜这是与DLL本身或线程相关的事情。

PS:作为奖金问题,谷歌为什么不返回与COM有关的任何优惠? :)

2 个答案:

答案 0 :(得分:2)

这听起来像是COM对象的IUnknown :: QueryInterface实现中的错误 - 没有设置输出指针但返回S_OK。

进程内服务器的CoCreateInstance基本上是:

  • 将DLL加载到内存
  • 调用DllGetClassObject以获取类工厂
  • 从分配新对象的类工厂中调用IClassFactory :: CreateInstance
  • 在新对象上调用IUnknown :: QueryInterface以获取所需的接口。

在任何步骤返回NULL但S_OK应该导致崩溃,除了最后的QI调用。

答案 1 :(得分:0)

发现问题:模块属性是在静态库上定义的,这使得COM对象变得疯狂;将它移动到DLL源解决了这个问题。