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