2010년 1월 20일 수요일

ActiveX 컨트롤 등록 방법

Regsvr32 같은 유틸리티를 이용하지 않고 프로그램 내에서 컨트롤을 레지스트리에
등록하려면 어떻게 해야합니까 ?
모든 AcitveX 컨트롤은 자신을 레지스트리에 등록하기위한 목적으로 DllRegisterServer라는
함수를 갖고 있습니다.
ActiveX 컨트롤을 메모리로 로드한 다음에 이 함수를 불러주면 원하는 일을 수행할 수 있습니다.
반대로 ActiveX 컨트롤을 레지스트리에서 제거하기 위한 용도로 DllUnRegisterServer라는
함수도 존재합니다.
// ==============================================================
// RegisterOCX     지정된 ActiveX 컨트롤을 레지스트리에 등록한다.
// --------------------------------------------------------------
// LPSTR pszString 등록하고자 하는 ActiveX 컨트롤의 절대 경로명
// ==============================================================
BOOL WINAPI RegisterOCX(LPSTR pszString)
{
    int iReturn = 0;
    HRESULT (STDAPICALLTYPE * lpDllEntryPoint)();
    HINSTANCE hLib;
    // OLE 라이브러리를 초기화한다.
    if (FAILED(OleInitialize(NULL)))
    {
        MessageBox(GetFocus(), "OLE 초기화 실패", "에러", MB_OK);
 return FALSE;
    }
    // 지정된 activeX 컨트롤을 메모리로 로드한다.
    hLib = LoadLibrary(pszString);
    if (hLib <= NULL)
    {
        MessageBox(GetFocus(), "파일을 로드하는데 실패했습니다.", "에러", MB_OK);
 OleUninitialize();
 return FALSE;
    }
    // "DllRegisterServer" 함수의 위치를 찾는다.
    lpDllEntryPoint = (long (__stdcall *)(void))GetProcAddress(hLib, "DllRegisterServer");
    // 이 함수를 호출합니다.
    if (lpDllEntryPoint)
    {
        if (FAILED((*lpDllEntryPoint)()))
 {
     DWORD dwRet;
     char szTemp[128];
     dwRet = GetLastError();
     wsprintf(szTemp, "에러 번호 : %lx", dwRet);
     MessageBox(GetFocus(), szTemp, "DllRegisterServer 에러", MB_OK);
     FreeLibrary(hLib);
     OleUninitialize();
     return FALSE;
  }
    }
    else
    {
        MessageBox(GetFocus(), "DllRegisterServer를 찾을 수 없습니다.", "에러", MB_OK);
 FreeLibrary(hLib);
 OleUninitialize();
 return FALSE;
    }
    FreeLibrary(hLib);
    OleUninitialize();
    return TRUE;
}


댓글 없음:

댓글 쓰기