// .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] = "./";
#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
#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
#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 사용이 끝나고 리소스를 해제하려면 아래와 같은 방법을 사용한다.
// 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:
댓글 쓰기