我有一个实现COM本地服务器的Windows服务。
当作为应用程序运行时,COM对象方法在一个单独的(不在主)线程中调用,这很好。当作为服务运行时,事情会发生变化 - 然后在服务线程的上下文中调用COM对象方法,这对我来说并不酷。
我看到它与公寓,MTA,STA等有关..但我无法弄清楚如何强制COM在单独的线程中调用我的对象方法而不是在服务中。
这可能与在服务启动时注册com对象有关吗?
我的环境是Windows 7 + delphi,但欢迎使用c ++解决方案。
更新2011-04-26 :
感谢@sharptooth和@Chris Dickson让我在“消息循环”的方向上搜索解决方案。
由于它是STA,app依赖于消息泵来将COM消息传递给注册coclass的线程。我将coclasses的注册重新定位到具有消息循环的单独线程中,并且现在在该线程中执行所有com调用。之前我曾尝试过这种方法,但忘记了消息循环,所以这是拼图的缺失部分。谢谢你们!
答案 0 :(得分:1)
将在您注册的任何线程上调用对象。如果您希望在单独的公寓(STA)中调用对象,则必须从该公寓注册类对象。这可以通过创建一个单独的线程并从那里注册来完成。