#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "loadfuncs.h"
void
UnloadFuncs(
FUNC_INFO fi[],
HINSTANCE h
)
{
int n;
if (fi)
for (n = 0; fi[n].func_ptr_var; n++)
*(fi[n].func_ptr_var) = NULL;
if (h) FreeLibrary(h);
}
int
LoadFuncs(
const char* dll_name,
FUNC_INFO fi[],
HINSTANCE* ph,
int* pindex,
int cleanup,
int go_on,
int silent
)
{
HINSTANCE h;
int i, n, last_i;
int error = 0;
UINT em;
if (ph) *ph = 0;
if (pindex) *pindex = -1;
for (n = 0; fi[n].func_ptr_var; n++)
*(fi[n].func_ptr_var) = NULL;
if (silent)
em = SetErrorMode(SEM_FAILCRITICALERRORS);
h = LoadLibrary(dll_name);
if (silent)
SetErrorMode(em);
if (!h)
return 0;
last_i = -1;
for (i = 0; (go_on || !error) && (i < n); i++)
{
void* p = (void*)GetProcAddress(h, fi[i].func_name);
if (!p)
error = 1;
else
{
last_i = i;
*(fi[i].func_ptr_var) = p;
}
}
if (pindex) *pindex = last_i;
if (error && cleanup && !go_on) {
for (i = 0; i < n; i++) {
*(fi[i].func_ptr_var) = NULL;
}
FreeLibrary(h);
return 0;
}
if (ph) *ph = h;
if (error) return 0;
return 1;
}