如何使COM连接点成为纯异步通信

时间:2014-06-04 10:18:34

标签: winapi com

我写了一个实现com连接点的示例com服务器。我在这个COM对象中调用一个方法,然后使用连接点机制在我的客户端代码中调用其他方法。

但以上列出的所有操作都是同步通信。我想让COM服务器是纯异步的,这样如果我的COM服务器得到一些事件,它应该将数据发送回它的客户端。

请建议如何使用COM连接点。

注意: - 我的COM服务器作为proc的proc运行。

提前致谢!!!

此致 阿希什

3 个答案:

答案 0 :(得分:3)

线程是永远 COM中的一个小细节,就像它在任何运行时环境中一样。您必须观察COM客户端程序选择的公寓状态。如果它是STA,是迄今为止最常见的选择,那么您有责任在客户端代码选择的线程上触发事件。忽略该要求只会导致无法诊断客户端程序中的错误。

因此,如果您在自己的代码中从工作线程触发事件,这是让事件处理程序运行异步的唯一方法,那么必须封送接口指针。 CoMarshalThreadInterfaceInStream()或更易于使用的IGlobalInterfaceTable可以完成该工作。坚如磐石的要求。当客户端程序在调用CoInitializeEx()时使用COINIT_MULTITHREADED选择加入时,它将异步运行。您唯一能做的就是通过选择ThreadingModel注册表值,使用" Both"来发布您的代码是线程安全的这一事实。或者"免费"。

答案 1 :(得分:1)

与没有COM的情况相同:

  1. 服务器对象的客户端调用方法;
  2. 该方法启动后台操作并返回;
  3. 后台操作可以​​使用单独的线程,异步I / O API,计时器API等。后台操作完成后,它会触发事件(在客户端提供的接收器接口上调用方法); < / LI>
  4. 客户处理事件。
  5. 回到COM,默认情况下COM中的所有方法调用都是同步的。当您在客户端提供的接收器接口上触发事件时,该调用将阻塞,直到客户端返回。这种行为有一个例外:IAdviseSink。如果被调用者与调用者位于不同的COM公寓中,则此接口的方法是异步的。但是,IAdviseSink可能不是您正在寻找的内容。

答案 2 :(得分:1)

使用asynchronous COM的标准方法要求接口具有用于异步接口的单独UUID。 IConnectionPoint没有异步UUID,因此您无法使用ICallFactory来实现异步COM。