원본글 주소 : 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 함수를 호출.
댓글 없음:
댓글 쓰기