3. Implementation/COM & ActiveX

In-Process server에서 CoCreateInstacne() 호출 과정

SSKK 2008. 10. 3. 23:55

클라이언트 애플리케이션에서 COM 객체의 인스턴스를 생성하기 위해 CoCreateInstance() 함수를 호출하면 내부적으로는 CoGetClassObject() 함수를 호출한다. 이때 CoGetClassObject() 함수는 레지스트리에서 해당 COM 객체의 정보를 찾아 CoLoadLibrary() API 함수를 호출함으로써 해당 COM 객체를 구현한 인-프로세스 서버 DLL을 메모리에 로드한다. 다음에 CoGetClassObject() 함수는 메모리에 로드한 인-프로세스 서버 DLL로부터 DllGetClassObject 익스포트 함수를 호출하고 생성하고자 하는 COM 객체의 CLSID를 넘겨준다.

 

이때 인-프로세스 서버 DLL에 구현된 DllGetClassObject() 함수에서는 인수로 넘어온 CLSID 값에 대응되는 클래스 팩토리 COM 객체의 인스턴스를 생성하고 클래스 팩토리 COM 객체의 IClassFactory 인터페이스 포인터를 구하여 CoGetClassObject() 함수에 리턴해 준다. 다시 CoGetClassObject() 함수는 CoCreateInstance() 함수에게 IClassFactory 인터페이스 포인터를 넘겨주게 되고 CoCreateInstane() 함수는 이 인터페이스 포인터를 통해 IClassFactory 인터페이스의 CreateInstance() 메서드를 호출함으로써 COM 객체의 인스턴스를 생성하게 된다.

 

결국 클라이언트 애플리케이션에서 COM 객체의 인스턴스를 생성하기 위해 CoCreateInstance() 함수를 호출하면 COM 라이브러리는 인-프로세스 서버 COM 컴포넌트 DLL을 메모리에 로드한 후 이 DLLDllGetClassObject() 익스포트 함수를 호출하는 것이다.

참고 : 전병선의 Component Development with Visual C++ & ATL