2012-05-25 6 views
1

외부 환경에서 COM 아파트를 이해하려고 힘듭니다.아파트는 외부 프로세스 환경에서 서버 측 또는 클라이언트 측에서 "활성"상태로 유지됩니까?

기본적으로 고객이 CoInitializeEx에 전화를 걸어 아파트에 자체 스레드를 등록해야하는 이유를 이해할 수 없습니다. STA 또는 MTA에있는 서버 스레드 및 서버 스레드가 사용하는 개체를 이해할 수 있습니다. 그러나 나는 왜 클라이언트이 이것을 염려해야하는지 이해할 수 없다.

모든 서류/안내서에 고객이 아파트에 등록하려면 CoInitializeEx으로 전화해야한다고 나와 있습니다. 서버가 클라이언트의 스레드 트랙을 유지한다는 의미입니까? 아파트 데이터가 클라이언트 프로세스에도 할당되어 있습니까?

답변

2

out-of-proc 서버에있는 COM 개체는 실제로 서버의 구현 코드와 컴파일러 및 COM 런타임에서 만든 RPC 프록시/스텁 코드의 두 부분으로 구성됩니다. 원격 COM 개체를 호출하면 로컬 프록시 개체에 대한 호출로 변환되어 일부 RPC 메커니즘을 사용하여 호출을 마샬링하여 메시지로 서버 프로세스에 전송합니다. 메시지는 서버의 스텁에 의해 선택되어 실제 COM 개체를 호출하고 결과를 프록시로 마샬링 한 다음 프록시를 언 마샬링하고 호출 클라이언트 코드로 반환합니다. 클라이언트와 COM 개체의 관점에서 DCOM의 경우와 같이 네트워크를 통해 발생하더라도 모든 호출은 로컬입니다.

이제 클라이언트의 프록시는 정상적인 COM 개체처럼 동작하며 아파트의 일종에 있어야합니다. 서버의 COM 개체도 자체 아파트에 있습니다. COM은 클라이언트와 서버가 서로 다른 스레딩 모델을 가질 수있게 해주고 적절한 synchorinsation을 처리합니다 (상호 작용하는 두 개의 코드 조각이 서로 다른 프로세스에있을 때 쉽게 죽을 수 있습니다).

MSDN에서 COM 가이드의 Process, Thread, and Apartments 부분을 읽으면 어떤 것이 무엇인지, 어떻게 상호 연결되는지 더 잘 이해할 수 있습니다.

1

스레드를 추적하는 서버가 아니며 특정 아파트에 COM이 연결된 스레드입니다. 또한 스레드를 소유하는 클라이언트이기 때문에 STA 또는 MTA를 만드는 것이 클라이언트의 선택입니다.

클라이언트가 스레드에 대해 원하는 아파트 모델을 선택하면 COM은 특정 호출을 얼마나 정확하게 충족 시킬지 결정합니다. COM 클래스가 MTA에서만 실행되도록 등록되어 있고 클라이언트의 Threda가 STA이면 COM의 작업자 MTA 스레드에서 실제 개체를 만들고 클라이언트의 STA로 해당 인터페이스를 마샬링하는 일을 담당합니다.

클라이언트가 작동 모드를 선택하면 COM은 서버의 등록과 함께 모두 가져옵니다.