情况是这样的,我用atl写的一个最简单的基于EXE的com服务,其中提供了一个接口叫Test()
代码如下,几乎是不能在简陋了,但问题出现了
STDMETHODIMP CMyProperty::Test(void)
{
    MessageBox( NULL, _T("haha"), _T("ok"), MB_OK );
    return S_OK;
}我启动三个客户端,分别调用Test()这时候弹出了三个haha的messagebox. 难道com接口调用不是互斥的吗?或者说不是串行化的吗?那如果我想串行化如何做,比如,在第一个人调用了test后,要等messagebox消失了后,第2个人的test函数才能执行,要怎么办呢?

解决方案 »

  1.   

    三个客户端, 会创建3个对象, 对象之间彼此没有关联的我想串行化如何做,比如,在第一个人调用了test后,要等messagebox消失了后,第2个人的test函数才能执行,要怎么办呢?
    Test函数可以设置一个命名事件, 用事件进行同步
      

  2.   

    自己控制com对象,Singleton模式等...
      

  3.   

    谢谢啊,我的com服务是基于aparment模式的。 在唯一的组件类头文件中已经声明为“单实例”模式DECLARE_CLASSFACTORY_SINGLETON(CMyProperty)。我发现原因可能是Messagebox不阻塞消息循环,也就是不阻塞com服务的exe,所以它可以同时被三个人用。用信号互斥,比如event,我也是实验过。 达不到预想的效果。 您考虑一下,假设你在test的头部等待一个event。然后messagebox后在setevent 那么将是一个奇怪的逻辑-》自己等待自己, 那么第一次调用顺利弹出了messagebox, 如果这时第2个人再调用,那么就会在test开头处等待,由于是单实例的,那么第2次调用将导致服务的exe死住,届时,第一次调用的messagebox也将无法点击确定按钮,或者说点了确定按钮不继续往下走了,也就执行不了setevent。因为服务被第2次调用阻塞掉了, 这样形成了一个“不是死锁的死锁”。 也许你会说再写个消息循环,好像也不行 总之 。 谁给个好的意见,很简单的测试环境啦,大虾测下啊
      

  4.   

    在组件中用MessageBox调试不是一个好主意,容易出现意想不到的问题。
      

  5.   

    谢谢了,我这个代码只是想测试下,就是想知道单实例的EXE com的接口是否是串行调用的,test函数能不能同时由多个客户调用?谁能确切的告诉我一下, 是串行还是并行?
      

  6.   

    是LZ用法不对罢了,和API无关维护一个内部的计数器。当有用户调用那个方法的时候,让计数器加1,在方法中判断当计数器>1的时候,直接返回失败。