블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

05-18 15:26

Recent Post

Recent Comment

Recent Trackback

Archive

2015. 5. 11. 11:13 Programming/COM

이글은 '선문비트 고급과정'에서 강의받은 내용을 토대로 작성하였으며, 비트 교육센터 자료를 참고하여 올린내용입니다. 문제가 될시 삭제가 될 수 있습니다.


작성날짜    : 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
posted by Kanais