2011-02-15 6 views

답변

5

자세한 내용은 Don Box의 저서 Essential COM에서 설명합니다.

AddRef/Release IClassFactory 인터페이스의 클래스 개체는 종종 out-of-process COM 서버에서 비어있는 메서드입니다. 이는 서버가 CoRegisterClassObject을 호출 할 때 클래스 개체에 대한 내부 참조가 유지되므로 "일반"in-process 서버 구현이 AddRef/Release 일 때 클래스 개체의 참조 횟수가 항상 1을 초과하고 서버 CoRevokeClassObject에 언제 연락해야하는지 알 수 없습니다.

COM 런타임은 CoGetClassObject을 호출 한 후 클래스 개체에 대한 외부 참조를 마샬링 할 때 IClassFactory::LockServer을 호출합니다. 이러한 방식으로 서버 프로세스 수명은 외부 참조의 존재 여부에 따라 적절하게 제어 될 수 있습니다.

+0

그 책에서 찾아 보는 것이 좋습니다 ... 왜 그렇게 생각하지 않았습니까! –

3

확실하지는 않지만, 클래스 팩토리를 가져 와서 IClassFactory 인터페이스를 통해 잠그고 인터페이스를 해제하기 위해 CoGetClassObject를 호출 할 수 있다고 생각합니다. 나중에 동일한 클래스에 대해 CoGetClassFactory를 다시 호출하면 메모리에 잠겨 있기 때문에 시스템은 새 클래스를 생성하는 대신 동일한 팩토리 객체를 반환합니다. 이렇게하면 해당 클래스의 많은 오브젝트를 작성할 때 성능이 향상 될 수 있습니다.

예, IClassFactory 인터페이스 포인터를 누르고 있으면 같은 결과를 얻을 수 있습니다. 하지만 앱을 시작할 때 팩토리 객체를 잠그고 종료 할 때 인터페이스 포인터를 풀어 놓으면 (글로벌 변수 등에서) 어딘가에 인터페이스 포인터를 가질 필요가 없습니다.

IClassFactory가 도입 된 이유가 의심 스럽습니다. : LockServer는 서버를 잠그는 것이 의미 론적으로 AddRef'ing과 동일하지 않다는 것입니다. AddRef/Release는 일반적인 객체 라이프 사이클 관리를위한 것으로 명확한 의미론을 정의합니다. 서버를 잠그는 것은 성능 조정입니다.

관련 문제