如何从不同的公寓模型访问COM对象?

如何从不同的公寓模型访问COM对象?,com,c++builder,atl,Com,C++builder,Atl,我有一个多线程的C++Builder GUI应用程序,它通过COM与第三方应用程序通信 我需要从多个线程调用COM对象的方法,并且我使用互斥锁保护访问。显然,主GUI线程必须使用STA模型,但我的工作线程需要使用MTA。COM对象是在MTA线程中构造的 由于MTA/STA不匹配,除了从GUI线程访问COM对象之外,一切正常 我读过一些关于编组的内容,但没有尝试实现它,因为我看到的示例似乎需要不同的访问语义,这取决于当前的单元模型,我真的希望有一些代码(来自程序员的POV)不关心当前的单元模型 那

我有一个多线程的C++Builder GUI应用程序,它通过COM与第三方应用程序通信

我需要从多个线程调用COM对象的方法,并且我使用互斥锁保护访问。显然,主GUI线程必须使用STA模型,但我的工作线程需要使用MTA。COM对象是在MTA线程中构造的

由于MTA/STA不匹配,除了从GUI线程访问COM对象之外,一切正常

我读过一些关于编组的内容,但没有尝试实现它,因为我看到的示例似乎需要不同的访问语义,这取决于当前的单元模型,我真的希望有一些代码(来自程序员的POV)不关心当前的单元模型


那么,有没有一种惯用的方法来编写在“相同”对象上运行但可以从STA和MTA线程调用的COM代码?

将COM对象接口放入,让GIT为您处理编组。当任何线程请求COM接口时,GIT会检查调用单元,并相应地提供直接指针或合适的代理。您的代码不会知道差异(或注意),只需根据需要正常使用返回的接口即可

这在MSDN上有记录:


需要封送接口指针,不能跳过。IGlobalInterfaceTable使它变得简单。@Hans,是的,但是如果我没有弄错的话,有些线程需要封送的指针,有些线程需要未封送的指针?我正在寻找一种方法来统一它,或者根据当前的线程单元模型动态切换哪个接口指针…?好吧,总是封送指针。如果不需要公寓转换,你只需要拿回原件。@Hans,如果你把答案写在评论里,Roddy怎么能接受呢?:-)这个问题被列为未回答的问题。