2022-05-03 10:25:52 +00:00
|
|
|
|
#include "HGDll.h"
|
|
|
|
|
#include "HGInc.h"
|
2022-08-09 03:59:29 +00:00
|
|
|
|
#include "HGInfo.h"
|
2022-05-03 10:25:52 +00:00
|
|
|
|
#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)
|
|
|
|
|
{
|
2022-11-24 03:28:57 +00:00
|
|
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "HGBase_CreateDll: dlopen fail, %s dlerror=%s", fileName, dlerror());
|
2022-11-25 10:00:33 +00:00
|
|
|
|
return HGBASE_ERR_LOADLIBRARY;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
#else
|
2022-07-29 02:04:28 +00:00
|
|
|
|
HMODULE hDll = LoadLibraryExA((const char *)fileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
if (NULL == hDll)
|
|
|
|
|
{
|
2022-11-24 03:28:57 +00:00
|
|
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "HGBase_CreateDll: LoadLibraryExA fail, %s GetLastError=%u", fileName, GetLastError());
|
2022-11-25 10:00:33 +00:00
|
|
|
|
return HGBASE_ERR_LOADLIBRARY;
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
#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;
|
2022-07-30 01:09:20 +00:00
|
|
|
|
}
|