2013-10-22 3 views
0

프로세스가 부족한 ATL COM 서버 (exe)가 있습니다. 클라이언트에 의해 시작될 때 서버는 일부 데이터를 폴링하는 작업자 스레드를 생성합니다. 데이터가 업데이트 될 때마다 업데이트 된 값으로 모든 클라이언트에 알리고 싶습니다.OOP COM 서버 업데이트 클라이언트

CoCreateInstanceEx를 통해 연결하고 Sink 개체를 만들고 연결 지점을 가져 와서 오류없이 Advise를 호출하는 COM 클라이언트를 만들었습니다. 그러나 서버가 Fire_event를 시도하면 IConnectionPointImpl :: m_vec가 비어 있으며 클라이언트에게 알림이 전송되지 않습니다.

서버가 자체 개체를 만들기 때문에 서버가 하나이고 클라이언트가 Advise를 호출 할 때 두 개의 IConnectionPointImpl :: m_vec 인스턴스가 생깁니다. 클라이언트로 서버 데이터를 가져올 수 있습니까?

+1

나는 이벤트가 클라이언트 용으로 생성 된 것과 다른 이유 때문에 이벤트가 발생하는 이유와 처음에 둘 이상의 오브젝트가있는 이유를 알아야합니다. – sharptooth

답변

0

이 방법을 권장합니다. 일반 바닐라 C++ 싱글 톤 (COM 객체 아님)을 만듭니다 - S으로 전화를 겁니다. S은 모든 미해결 된 COM 개체에 대한 약한 비 - AddRef '참조의 목록을 보유합니다 (COM 인터페이스 포인터가 아닌 C++ 클래스 포인터가 편리 할 것입니다). COM 객체는 자신의 생성자에 S으로 등록하고 소멸자에서 등록 취소합니다.

재미있는 일이 발생하면 작업자 스레드는 S에게 알리고 (등록 된 메서드 호출) 등록 된 모든 COM 개체에 알림을 보내고 Fire_event을 호출합니다.

작업자 스레드에서 이벤트를 실행할 때는주의하십시오. 주 스레드와 작업자 스레드가 모두 MTA를 입력하지 않는 한 이는 잘못된 것입니다. 자세한 내용 및 해결 방법은 http://vcfaq.mvps.org/com/1.htm을 참조하십시오.