blob: 44ec54dfaa2b9b3413cbf4f8930df6df795e2e1b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "loadfuncs.h"
//
// UnloadFuncs:
//
// This function will reset all the function pointers of a function loaded
// by LaodFuncs and will free the DLL instance provided.
//
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);
}
//
// LoadFuncs:
//
// This function try to load the functions for a DLL. It returns 0 on failure
// and non-zero on success. The parameters are descibed below.
//
int
LoadFuncs(
const char* dll_name,
FUNC_INFO fi[],
HINSTANCE* ph, // [out, optional] - DLL handle
int* pindex, // [out, optional] - index of last func loaded (-1 if none)
int cleanup, // cleanup function pointers and unload on error
int go_on, // continue loading even if some functions cannot be loaded
int silent // do not pop-up a system dialog if DLL cannot be loaded
)
{
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;
}
|