인프로세스 서버 : 다른 프로세스에서 생성&실행되는 서버
아웃오브프로세스 : 별도의 프로세스가 생성되어 실행되는 서버
I로 시작되며, IUnknown 에서 상속되어야 한다.
IUnkonwn에 정의되는 기본 메소드
언어독립성을 유지하기 위해서 상속만을 지원한다. polymorphism은 지원하지 않는 정책
OSF가 제공하는 GUID를 차용
128비트 (16바이트)의 구조체
모든 COM 객체와 해당되는 COM 내부의 인터페이스는 독립적인 GUID를 갖는다.
UUID 라고도 부른다.
CLSID : COM 객체의 GUID
IID : 인터페이스의 GUID
guiddef.h 에 구조체가 선언되어 있다.
typedef struct _GUID { unsigned long Data1, Data2, Data3; unsigned char Data4[ 8 ]; } GUID;
비교기능
구조체이기 때문에 파라미터로 오갈 때에는 레퍼런스 형식으로 사용된다.
StringFromGUID2 : GUID를 스트링의 형식으로 변경하는 함수
CLSID의 별명 (alias)
128비트의 코드 형태는 기억하기 어려우므로 문자열 식별자를 제공
<컴포넌트 or 라이브러리명>.<객체명>.<버젼> // 예 Excel.Application.10
hkey_classes_root 내부의 각 항목들이 COM의 ProgID 들
ProgID로부터 CLSID를 구한다.
HRESULT CLSIDFromProgID( LPOLESTR /*ProgID 문자열*/, LPCLSID /*리턴된 CLSID*/ );
메모 : COM API 함수는 “Co”로 시작된다.
// 등록 regsvr32 COMServerName.dll // 해제 regsvr32 /u COMServerName.dll
정상 : S_OK (== 0x0L)
에러 : 0x80000000L (== 마이너스 얼마 얼마)
COM 사용 개시 : CoInitializeEx( NULL, /*dwCoInit*/ ), 첫번째 값은 예약값으로 현재는 널.
CoCreateInstance( CLSID, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&pUnk ) 로 CLSID와 IID를 넘겨서 인터페이스 포인터를 구한다.
CLSCTX_ALL | clsid를 검색할 장소 지정 |
IID_IUnknown | 예제로사용된 IID. 사용시에는 얻으려는 인터페이스 아이디 (IID)를 넣는다. |
pUnk | 리턴된 인터페이스 포인터 |
CoCreateInstance()에 의해 호출되는 CoGetClassObject()가 하는일
HRESULT CoGetClassObject( __in REFCLSID rclsid, __in DWORD dwClsContext, __in_opt COSERVERINFO pServerInfo, __in REFIID riid, __out LPVOID *ppv );
객체 위치(경로)를 구했으면,
// 의미전달용 코드 DllGetClassObject( CLSID, IID, (out)ppv );
HRESULT CoGetClassObject( __in REFCLSID rclsid, __in DWORD dwClsContext, __in_opt COSERVERINFO pServerInfo, __in REFIID riid, __out LPVOID *ppv );
CoCreateInstance()를 호출 한뒤,
(IClassFactory*)pClassFactory->CreateInstance( NULL, riid, ppv );