【问题标题】:Error instantiating COM object实例化 COM 对象时出错
【发布时间】:2010-11-05 16:28:17
【问题描述】:

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

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

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

  • 尝试使用以 COINIT_MULTITHREADED 和 COINIT_APARTMENTTHREADED 启动的 CoInitalizeEx 运行程序

  • 该项目是一个dll,其中使用了COM dll

  • 我已经尝试了相同的方法,但没有启动新线程,但错误仍然存​​在

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

PS:作为额外的问题,为什么 google 不返回任何与 COM 相关的有利信息? :)

【问题讨论】:

    标签: c++ windows com


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不这么认为,因为这样会使我制作的示例应用程序也失败。
    【解决方案2】:

    发现问题:module 属性是在静态库上定义的,导致 COM 对象发疯;将其移至 DLL 源即可解决问题。

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多