00001 #ifndef __GLIBRARY_H
00002 #define __GLIBRARY_H
00003
00004
00005 #ifdef WIN32
00006
00007
00008 typedef HMODULE _SysLibHandle;
00009
00010 #else
00011
00012
00013
00014 #if defined BEOS
00015 typedef image_id _SysLibHandle;
00016 #elif defined(LINUX)||defined(MAC)
00017 typedef void *_SysLibHandle;
00018 #else // atheos/linux
00019 typedef int _SysLibHandle;
00020 #endif
00021
00022 #endif
00023
00024
00025 class LgiClass GLibrary
00026 {
00027 char *FileName;
00028 _SysLibHandle hLib;
00029
00030 public:
00031 GLibrary(const char *File = 0);
00032 virtual ~GLibrary();
00033
00034 _SysLibHandle Handle() { return hLib; }
00035 char *GetFileName() { return FileName; }
00036 virtual bool IsLoaded() { return hLib != 0; }
00037
00038 bool Load(const char *File);
00039 bool Unload();
00040 void *GetAddress(const char *Resource);
00041 };
00042
00043
00044 #define GLibBreakPoint LgiAssert(0);
00045 #define GLibCallType // __stdcall
00046
00047 #define GLibFunc0(ret, func) \
00048 ret func() \
00049 { \
00050 typedef ret (GLibCallType *p_##func)(); \
00051 p_##func p = (p_##func) GetAddress(#func); \
00052 if (p) \
00053 { \
00054 return p(); \
00055 } \
00056 GLibBreakPoint \
00057 return 0; \
00058 }
00059
00060 #define GLibFunc1(ret, func, argtype, argname) \
00061 ret func(argtype argname) \
00062 { \
00063 typedef ret (GLibCallType *p_##func)(argtype); \
00064 p_##func p = (p_##func) GetAddress(#func); \
00065 if (p) \
00066 { \
00067 return p(argname); \
00068 } \
00069 GLibBreakPoint \
00070 return 0; \
00071 }
00072
00073 #define GLibFunc2(ret, func, argtype1, argname1, argtype2, argname2) \
00074 ret func(argtype1 argname1, argtype2 argname2) \
00075 { \
00076 typedef ret (GLibCallType *p_##func)(argtype1, argtype2); \
00077 p_##func p = (p_##func) GetAddress(#func); \
00078 if (p) \
00079 { \
00080 return p(argname1, argname2); \
00081 } \
00082 GLibBreakPoint \
00083 return 0; \
00084 }
00085
00086 #define GLibFunc3(ret, func, argtype1, argname1, \
00087 argtype2, argname2, \
00088 argtype3, argname3) \
00089 ret func(argtype1 argname1, \
00090 argtype2 argname2, \
00091 argtype3 argname3) \
00092 { \
00093 typedef ret (GLibCallType *p_##func)(argtype1, \
00094 argtype2, \
00095 argtype3); \
00096 p_##func p = (p_##func) GetAddress(#func); \
00097 if (p) \
00098 { \
00099 return p(argname1, argname2, argname3); \
00100 } \
00101 GLibBreakPoint \
00102 return 0; \
00103 }
00104
00105 #define GLibFunc4(ret, func, argtype1, argname1, \
00106 argtype2, argname2, \
00107 argtype3, argname3, \
00108 argtype4, argname4) \
00109 ret func(argtype1 argname1, \
00110 argtype2 argname2, \
00111 argtype3 argname3, \
00112 argtype4 argname4) \
00113 { \
00114 typedef ret (GLibCallType *p_##func)(argtype1, \
00115 argtype2, \
00116 argtype3, \
00117 argtype4); \
00118 p_##func p = (p_##func) GetAddress(#func); \
00119 if (p) \
00120 { \
00121 return p(argname1, argname2, \
00122 argname3, argname4); \
00123 } \
00124 GLibBreakPoint \
00125 return 0; \
00126 }
00127
00128 #define GLibFunc5(ret, func, argtype1, argname1, \
00129 argtype2, argname2, \
00130 argtype3, argname3, \
00131 argtype4, argname4, \
00132 argtype5, argname5) \
00133 ret func(argtype1 argname1, \
00134 argtype2 argname2, \
00135 argtype3 argname3, \
00136 argtype4 argname4, \
00137 argtype5 argname5) \
00138 { \
00139 typedef ret (GLibCallType *p_##func)(argtype1, \
00140 argtype2, \
00141 argtype3, \
00142 argtype4, \
00143 argtype5); \
00144 p_##func p = (p_##func) GetAddress(#func); \
00145 if (p) \
00146 { \
00147 return p(argname1, argname2, \
00148 argname3, argname4, \
00149 argname5); \
00150 } \
00151 GLibBreakPoint \
00152 return 0; \
00153 }
00154
00155 #define GLibFunc6(ret, func, argtype1, argname1, \
00156 argtype2, argname2, \
00157 argtype3, argname3, \
00158 argtype4, argname4, \
00159 argtype5, argname5, \
00160 argtype6, argname6) \
00161 ret func(argtype1 argname1, \
00162 argtype2 argname2, \
00163 argtype3 argname3, \
00164 argtype4 argname4, \
00165 argtype5 argname5, \
00166 argtype6 argname6) \
00167 { \
00168 typedef ret (GLibCallType *p_##func)(argtype1, \
00169 argtype2, \
00170 argtype3, \
00171 argtype4, \
00172 argtype5, \
00173 argtype6); \
00174 p_##func p = (p_##func) GetAddress(#func); \
00175 if (p) \
00176 { \
00177 return p(argname1, argname2, \
00178 argname3, argname4, \
00179 argname5, argname6); \
00180 } \
00181 GLibBreakPoint \
00182 return 0; \
00183 }
00184
00185 #define GLibFunc7(ret, func, argtype1, argname1, \
00186 argtype2, argname2, \
00187 argtype3, argname3, \
00188 argtype4, argname4, \
00189 argtype5, argname5, \
00190 argtype6, argname6, \
00191 argtype7, argname7) \
00192 ret func(argtype1 argname1, \
00193 argtype2 argname2, \
00194 argtype3 argname3, \
00195 argtype4 argname4, \
00196 argtype5 argname5, \
00197 argtype6 argname6, \
00198 argtype7 argname7) \
00199 { \
00200 typedef ret (GLibCallType *p_##func)(argtype1, \
00201 argtype2, \
00202 argtype3, \
00203 argtype4, \
00204 argtype5, \
00205 argtype6, \
00206 argtype7); \
00207 p_##func p = (p_##func) GetAddress(#func); \
00208 if (p) \
00209 { \
00210 return p(argname1, argname2, \
00211 argname3, argname4, \
00212 argname5, argname6, argname7); \
00213 } \
00214 GLibBreakPoint \
00215 return 0; \
00216 }
00217
00218 #endif