이글은 '선문비트 고급과정'에서 강의받은 내용을 토대로 작성하였으며, 비트 교육센터 자료를 참고하여 올린내용입니다. 문제가 될시 삭제가 될 수 있습니다.
작성날짜 : 2011-03-16 |
Registry
윈도우 설정정보를 가지고 있는 곳.
Registry의 사용
Com DLL을 레지스트리에 등록하고, 사용할 수 있는 방법
DLL을 로드하기 위해 DLL파일명을 사용하는 것이 아니라 Component를 유일하게 식별 가능한 CLSID를 이용
레지스트리 등록 및 해제 함수 이용
API 함수를 통해 Registry 추가 및 삭제 등을 할 수 있다.
RegCreateKeyEx //Key 생성
RegSetValueEx //Key 값 설정
RegOpenKeyEx // Key Open
RegEnumKeyEx //SubKey 조회
RegDeleteKey //SubKey 삭제
RegCloseKey // 핸들반환
DLL이 가지는 문제
버전 정보가 꼬인다. (처음 배포했을 때는 상관이 없다. 하지만 다른 사람들은 버전 업데이트를 받았고 자신은 업데이트를 받지 않았을 경우 프로그램이 제대로 실행되지 않는다.)
개별적으로 버전 업데이트가 되기 때문에 버전 관리가 어렵다. – (일명 DLL Hell)
등록을 위한 코드
DLL이 Client에 의해 사용되기 위해서는 레지스트리에 등록되어야만 한다.
DLL 파일에 Export되는 함수 DllRegisterServer를 통하여 DLL을 레지스트리에 등록하는 코드를 구현한다.
STDAPI DllRegisterServer(void);
DllUnregisterServer를 통하여 DLL을 레지스트리에서 해제하는 코드를 구현한다.
STDAPI DllUnregisterServer(void);
regsvr32 유틸리티
regsvr32.exe 유틸리티를 이용하여 DLL을 레지스트리에 등록한다.
regsvr32 “DLL파일경로”
Option :
DLL 해제 : /u
확인없음 : /v
등록 : DLL의 export된 DllRegisterServer함수를 수행한다.
해제 : DLL의 export된 DllUnregisterServer함수를 수행한다.
DLL안에 내부적으로 DllRegisterServer라는 함수를 작성하고 export해놓으면 regsvr32라는 유틸리티가 DllRegisterServer 함수를 호출한다.
DllRegisterServer 함수에는 Reg 등록 코드를 구현.
DllRegisterServer 함수에는 Reg 해제 코드를 구현.
regsvr32 실행
프로그램 : 실행 / regsvr32
개발환경 : Tools-> Register Control 실행
DLL안에 export되어 있는 함수를 호출해주는 역할을 함.
시작 -> 실행 -> regsvr32 경로\dll파일명.확장자
메모장에 ‘regsvr32 경로\dll파일명.확장자‘ 쓰고 저장 할 때 ‘파일명.bat’로 저장해서 더블 클릭해서 사용하면 됨.
DllGetClassObject
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID * ppv);
rclsid
[in] CLSID that will associate the correct data and code.
riid
[in] Reference to the identifier of the interface that the caller is to use to communicate with the class object. Usually, this is IID_IClassFactory (defined in the OLE headers as the interface identifier for IClassFactory).
ppv
[out] Address of pointer variable that receives the interface pointer requested in riid. Upon successful return, *ppv contains the requested interface pointer. If an error occurs, the interface pointer is NULL.
DllGetClassObject 구현
DLL 파일에 Export되는 함수 DllGetClassObject 를 통하여 객체가 생성되는 코드를 구현할 수 있다.(IClassFactory 인터페이스를 사용할 경우에는 Class 팩토리 객체를 생성한다.)
STDAPI DllGetClassObject(REFCLSID clsid, REFIID iid,LPVOID *ppv)
{
*ppv = static_cast<ISetVal*>(new CInsideCom);
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
COM Library ( COM에 관련된 API 함수 – 접두어 CO가 붙음)
COM Library를 사용하여 반복되는 일련의 과정을 편리하게 사용가능(등록,객체생성,interface 포인터획득)
COM Library의 초기화
HRESULT CoInitialize( LPVOID pvReserved //Reserved; must be NULL );
COM Library의 해제
void CoUninitialize( );
CoGetClassObject
STDAPI CoGetClassObject( REFCLSID rclsid,
DWORD dwClsContext,
COSERVERINFO * pServerInfo,
REFIID riid,
LPVOID * ppv);
rclsid : CLSID associated with the class object
dwClsContext : Context for running executable code
pServerInfo : Pointer to machine on which the object is to be instantiated
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\APPID\
{AppID_value}\RemoteServerName = server_name
riid : Reference to the identifier of the interface
ppv : Address of output variable that receives the interface pointer requested in riid
찾아오고자 하는 인터페이스를 한번에 찾아주는 함수.
rclsid : 등록되는 clsid
dwClsContext : 현재 실행되고 있는 context에 관한 정보
pServerInfo : 서버 정보(in of processor, out of processor인지 구별)
riid : Interface ID
ppv : Interface를 담아 올 Interface Pointer
CoGetClassObject 사용예
IUnknown* pIUnknown=NULL;
HRESULT hr = CoGetClassObject(
CLSID_COMPONENT, //clsid
CLSCTX_INPROC_SERVER, //context
NULL, //this machine
IID_IUnknown, //interface id
(LPVOID*) &pIUnknown); //interface pointer
CLSCTX
typedef enum tagCLSCTX {
CLSCTX_INPROC_SERVER = 1,
CLSCTX_INPROC_HANDLER = 2,
CLSCTX_LOCAL_SERVER = 4
CLSCTX_REMOTE_SERVER = 16
CLSCTX_NO_CODE_DOWNLOAD = 400
CLSCTX_NO_FAILURE_LOG = 4000
} CLSCTX;
#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)
#define CLSCTX_ALL (CLSCTX_INPROC_HANDLER | CLSCTX_SERVER)
COM 라이브러리 함수를 사용 할려면 상단에 CoInitialize(NULL);
를 써줘야 함.
'Programming > COM' 카테고리의 다른 글
[COM] COM 이란? (0) | 2015.05.11 |
---|---|
[COM] Class Factory (0) | 2015.05.11 |
[COM] Create GUID (0) | 2015.05.11 |
[COM] Component란? (0) | 2015.05.11 |
[COM] 재정의(overriding) (0) | 2015.05.11 |