2014년 10월 29일 수요일

CoCreateInstance 에서 com객체 생성 순서

원본글 주소 : http://blog.naver.com/ramboman?Redirect=Log&logNo=40021817221

===========================================================================

STDAPI CoCreateInstance (
   FEFCLSID         rclsid,
   LPUNKNOWN     pUnkOuter,
   DWORD             dwClsContext,
   REFIID              riid,
   LPVOID *          ppv )
{
   *ppv = NULL;

   IClassFactory* pIFactory = NULL;

   HRESULT hr = CoGetClassObject(rclsid,
                                dwClsContext,
                                NULL,
                                IID_IClassFactory,
                                (LPVOID*)&pIFactory);

   if(SUCCEEDED(hr)) {
             hr = pIFactory -> CreateInstance(pUnkOuter, riid, ppv);
             pIFactory -> Release();
   }
   return (hr);

}

===========================================================================



1. CoCreateInstance() 함수

client application에서 CoCreateInstance 함수를 사용하여 COM 개체의 instance를 생성하려고 할때, CoCreateInstance 함수 내부에서는 CoGetClassObject 함수를 호출하게 된다.
 
2. < CoGetClassObject() 함수 ( CoCreateInstance()  < CoGetClassObject() )

시스템 레지스트리의 HKEY_CLASSES_ROOT 루트키 밑에 있는 CLSID 서브 키에서 rclsid
매개변수에 지정된 CLSID와 같은 서브키를 찾아, 해당 서브키 밑에 있는 InprocServer32
(인-프로세스 서버인 경우) 또는, LocalServer32(로컬 서버인 경우) 서브 키 값에 지정된
COM 개체를 포함하고 있는 COM 컴포넌트 서버(DLL, EXE)의 위치값을 얻는다.



3. < CoLoadLibrary() 함수 ( CoGetClassObject() < CoLoadLibrary() )

CoLoadLibrary() 함수에서 얻어온 위치값의 COM 컴포넌트 서버를 메모리에 로드한다.


1) DLL로 구현된 인-프로세스 서버
 4. < DllGetClassObject() 함수 ( CoGetClassObject() < DllGetClassObject() )
CoGetClassObject 함수는 DLL의 DllGetClassObject 익스포트 함수를 호출하게 된다.
DllGetClassObject 함수는 IClassFactory interface를 구현한 클래스 팩토리 COM 개체의
인스턴스를 생성하고, CoGetClassObject 함수에서 요청한 IClassFactory 인터페이스
포인터를 리턴하게 된다.



5. < IClassFactory::CreateInstance() 함수

( CoCreateInstance() < IClassFactory::CreateInstance() )
만약 COM 컴포넌트가 성공적으로 클래스 팩토리 COM 개체의 인스턴스를 생성하고

IClassFactory 인터페이스 포인터를 리턴하였다면 CoCreateInstance 함수에서 리턴되는
IClassFactory 인터페이스 포인터를 통하여 IClassFactory::CreateInstacne 함수를 호출.

댓글 없음: