code_app/modules/base/HGDll.cpp

95 lines
1.8 KiB
C++

#include "HGDll.h"
#include "HGInc.h"
#include "HGInfo.h"
#if !defined(HG_CMP_MSC)
#include <dlfcn.h>
#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;
}