#include "HGDll.h" #include "HGInc.h" #include "HGInfo.h" #if !defined(HG_CMP_MSC) #include #endif struct HGDllImpl { HGDllImpl() { m_hDll = NULL; } ~HGDllImpl() { if (NULL != m_hDll) { #if !defined(HG_CMP_MSC) dlclose(m_hDll); #else FreeLibrary(m_hDll); #endif m_hDll = NULL; } } #if !defined(HG_CMP_MSC) void* m_hDll; #else HMODULE m_hDll; #endif }; HGResult HGAPI HGBase_CreateDll(const HGChar* fileName, HGDll* dll) { if (NULL == fileName || NULL == dll) { return HGBASE_ERR_INVALIDARG; } #if !defined(HG_CMP_MSC) void* hDll = dlopen(fileName, RTLD_LAZY); if (NULL == hDll) { HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "HGBase_CreateDll: dlopen fail, %s dlerror=%s", fileName, dlerror()); return HGBASE_ERR_LOADLIBRARY; } #else HMODULE hDll = LoadLibraryExA((const char *)fileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (NULL == hDll) { HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "HGBase_CreateDll: LoadLibraryExA fail, %s GetLastError=%u", fileName, GetLastError()); return HGBASE_ERR_LOADLIBRARY; } #endif HGDllImpl* dllImpl = new HGDllImpl; dllImpl->m_hDll = hDll; *dll = (HGDll)dllImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_DestroyDll(HGDll dll) { if (NULL == dll) { return HGBASE_ERR_INVALIDARG; } HGDllImpl* dllImpl = (HGDllImpl*)dll; delete dllImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_GetDllProcAddress(HGDll dll, const HGChar* symbol, HGPointer* func) { if (NULL == dll || NULL == symbol || NULL == func) { return HGBASE_ERR_INVALIDARG; } HGDllImpl* dllImpl = (HGDllImpl*)dll; #if !defined(HG_CMP_MSC) *func = dlsym(dllImpl->m_hDll, symbol); #else * func = GetProcAddress(dllImpl->m_hDll, (const char *)symbol); #endif if (NULL == *func) { return HGBASE_ERR_FAIL; } return HGBASE_ERR_OK; }