2011-10-10 2 views
3

COM을 통해 타사 앱과 통신하는 멀티 스레드 C++ Builder GUI 앱이 있습니다.다른 아파트 모델에서 COM 개체에 액세스하는 방법?

여러 스레드에서 COM 개체의 메서드를 호출해야하며 뮤텍스로 액세스를 보호합니다. 분명히 메인 GUI 스레드 STA 모델을 사용해야하지만 내 작업자 스레드는 MTA를 사용해야합니다. COM 개체는 MTA 스레드로 생성됩니다.

MTA/STA가 일치하지 않아 GUI 스레드에서 COM 개체에 대한 액세스가 인 경우를 제외하고 모두 정상적으로 작동합니다.

마샬링에 대해 조금 읽었지만 구현하지 않으려했습니다. 예를 들어 현재 아파트 모델에 따라 다른 액세스 의미가 필요하기 때문에 실제로 코드를 갖고 싶습니다. 그 (프로그래머의 POV에서) 현재 아파트 모델에 대해 상관하지 않습니다.

그래서 '동일한'개체에서 작동하지만 STA 및 MTA 스레드 모두에서 호출 할 수있는 COM 코드를 작성하는 관용적 인 방법이 있습니까?

+2

당신이 그것을 건너 뛸 수없는, 인터페이스 포인터 * * 필요 마샬링. IGlobalInterfaceTable을 사용하면 쉽게 사용할 수 있습니다. –

+0

@Hans, 네, 맞습니다. 일부 스레드는 마샬링 된 포인터가 필요하고 다른 스레드는 비 정렬 화 된 포인터가 필요합니까? 그 스레드를 통합하거나 현재 스레드 아파트 모델에 따라 인터페이스 포인터를 동적으로 전환하는 방법을 찾고 있는데 ...? – Roddy

+6

글쎄, 항상 포인터를 마샬링합니다. 아파트 전환이 필요없는 경우 원본을 다시 받으실 수 있습니다. –

답변

1

COM 개체 인터페이스를 Global Interface Table에 넣고 GIT가 마샬링을 처리하도록합니다. 모든 스레드가 COM 인터페이스를 요청하면 GIT는 호출하는 아파트를 확인하고 이에 따라 직접 포인터 나 적절한 프록시를 제공합니다. 코드가 차이점 (또는주의)을 알지 못한다면, 필요한 경우 반환 된 인터페이스를 정상적으로 사용하십시오.

이것은 MSDN에 설명되어 있습니다 :

Accessing Interfaces Across Apartments

관련 문제