2011-10-10 69 views
3

我有一个多线程C++ Builder GUI应用程序,它通过COM与第三方应用程序进行通信。如何访问来自不同公寓模型的COM对象?

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

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

我已经读了一些关于编组,但还没有试图实现它,因为我看到的例子似乎需要不同的访问语义,取决于当前的公寓模型,我真的想要代码(来自程序员的POV)不关心当前的公寓模型。

那么,有没有一种习惯写COM代码的方式来运行'相同'对象,但可以从STA和MTA线程中调用?

+2

封送接口指针*为必填*,你不能跳过它。 IGlobalInterfaceTable使其变得容易。 –

+0

@Hans,是的,但是如果我有它的权利,一些线程需要编组指针,其他线程需要unmarshalled指针?我正在寻找一种方法来统一,或根据当前的线程公寓模型动态地切换哪个接口指针......? – Roddy

+6

嗯,只是总是指挥指挥官。如果不需要进行公寓转换,您只需获得原件。 –

回答

1

将COM对象接口放入Global Interface Table并让GIT为您处理编组。当任何线程请求COM接口时,GIT检查呼叫公寓并相应地提供直接指针或合适的代理。您的代码不会知道区别(或关心),只需根据需要正常使用返回的接口即可。

这是记录在MSDN:

Accessing Interfaces Across Apartments