C++ library(.dll .so) load and unload

// .dll .so 라이브러리 로드
#ifdef _WINDOWS
#include <windows.h>
#elif _LINUX
#include <dlfcn.h>
#endif
#ifdef _WINDOWS
HMODULE    m_hdll_MyModule;
#elif _LINUX
t_pVoid    m_hdll_MyModule;
#endif
IModule*   m_pMyModule;

typedef void* (*pvFunctv)();
pvFunctv CreateMyModule;
t_Char dll_path[1024] = "./";

// dll(so) 로딩하기
#ifdef _WINDOWS
strcat(dll_path, "MyModule.dll");
m_hdll_MyModule = LoadLibrary(dll_path);
#elif _LINUX
strcat(dll_path, "libMyModule.so");
m_hdll_MyModule = dlopen(dll_path, RTLD_LOCAL | RTLD_LAZY);
#endif

// dll(so) 인스턴스 가져오기
#ifdef _WINDOWS
CreateMyModule = static_cast<pvFunctv>((t_pVoid)GetProcAddress(m_hdll_MyModule, "GetInstance"));
#elif _LINUX
CreateMyModule = (pvFunctv)dlsym(m_hdll_MyModule, "GetInstance");
#endif
m_pMyModule = static_cast<IModule*>(CreateMyModule());

// dll(so) 사용하기
// 중략...

// dll(so) 해제하기
#ifdef _WINDOWS
FreeLibrary(m_hdll_MyModule);
#elif _LINUX
dlclose(m_hdll_MyModule);
#endif

#####

// 윈도우 환경에서 .dll 을 사용하거나 리눅스 환경에서 .so 를 사용할때
// library 생성 전에 초기화를 하거나 library 사용이 끝나고 리소스를 해제하려면 아래와 같은 방법을 사용한다.
int gInstance = 0;

#ifdef _WINDOWS
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*)
{
    hinst;
    switch(reason)
    {
        case DLL_PROCESS_ATTACH: // 프로세스가처음접근할때
            gInstance = 100;
            break;
        case DLL_PROCESS_DETACH: // 프로세스가접근을해제할때
            gInstance = 0;
            break;
        case DLL_THREAD_ATTACH:  // 쓰레드가처음접근할때
            break;
        case DLL_THREAD_DETACH:  // 쓰레드가접근을해제할때
            break;
    }
    return 1;
}

#elif _LINUX
void __attribute__ ((constructor)) LoadSo() // 프로세스가처음접근할때
{
    gInstance = 100;
}
void __attribute__ ((destructor)) UnLoadSo() // 프로세스가접근을해제할때
{
    gInstance = 0;
}
#endif

#####

comments:

댓글 쓰기