我有一个多线程C ++ Builder GUI应用程序,它通过COM与第三方应用程序通信。
我需要从多个线程调用COM对象的方法,并且我使用互斥锁来保护访问权限。显然,主GUI线程必须使用STA模型,但我的工作线程需要使用MTA。 COM对象是在MTA线程中构建的。
由于MTA / STA不匹配,一切正常除了从GUI线程访问COM对象外。
我已经阅读了一些关于编组的内容,但是没有尝试实现它,因为我看到的示例似乎需要不同的访问语义,这取决于当前的公寓模型,我真的希望有代码(来自程序员的POV)并不关心当前的公寓模型。
那么,是否有一种惯用的方法来编写在“相同”对象上运行的COM代码,但是可以从STA和MTA线程调用它?
答案 0 :(得分:1)
将COM对象接口放入Global Interface Table并让GIT为您处理编组。当任何线程请求COM接口时,GIT会检查调用的单元,并相应地提供直接指针或合适的代理。您的代码不知道差异(或关注),只需根据需要正常使用返回的接口。
这在MSDN上有记录: