00001 #ifndef __GLIBRARY_H
00002 #define __GLIBRARY_H
00003
00004
00005 #ifdef WIN32
00006
00007
00008 typedef HMODULE _SysLibHandle;
00009 #define _SysDefLibExtension ".dll"
00010
00011 #else
00012
00013
00014
00015 #if defined BEOS
00016 typedef image_id _SysLibHandle;
00017 #elif defined LINUX
00018 typedef void *_SysLibHandle;
00019 #else // atheos/linux
00020 typedef int _SysLibHandle;
00021 #endif
00022
00023 #define _SysDefLibExtension ".so"
00024
00025 #endif
00026
00027
00028 class LgiClass GLibrary
00029 {
00030 char *FileName;
00031 _SysLibHandle hLib;
00032
00033 public:
00034 GLibrary(char *File = 0);
00035 virtual ~GLibrary();
00036
00037 _SysLibHandle Handle() { return hLib; }
00038 char *GetFileName() { return FileName; }
00039 virtual bool IsLoaded() { return hLib != 0; }
00040
00041 bool Load(char *File);
00042 bool Unload();
00043 void *GetAddress(char *Resource);
00044 };
00045
00046
00047 #define GLibBreakPoint LgiAssert(0);
00048 #define GLibCallType // __stdcall
00049
00050 #define GLibFunc0(ret, func) \
00051 ret func() \
00052 { \
00053 typedef ret (GLibCallType *p_##func)(); \
00054 p_##func p = (p_##func) GetAddress(#func); \
00055 if (p) \
00056 { \
00057 return p(); \
00058 } \
00059 GLibBreakPoint \
00060 return 0; \
00061 }
00062
00063 #define GLibFunc1(ret, func, argtype, argname) \
00064 ret func(argtype argname) \
00065 { \
00066 typedef ret (GLibCallType *p_##func)(argtype); \
00067 p_##func p = (p_##func) GetAddress(#func); \
00068 if (p) \
00069 { \
00070 return p(argname); \
00071 } \
00072 GLibBreakPoint \
00073 return 0; \
00074 }
00075
00076 #define GLibFunc2(ret, func, argtype1, argname1, argtype2, argname2) \
00077 ret func(argtype1 argname1, argtype2 argname2) \
00078 { \
00079 typedef ret (GLibCallType *p_##func)(argtype1, argtype2); \
00080 p_##func p = (p_##func) GetAddress(#func); \
00081 if (p) \
00082 { \
00083 return p(argname1, argname2); \
00084 } \
00085 GLibBreakPoint \
00086 return 0; \
00087 }
00088
00089 #define GLibFunc3(ret, func, argtype1, argname1, \
00090 argtype2, argname2, \
00091 argtype3, argname3) \
00092 ret func(argtype1 argname1, \
00093 argtype2 argname2, \
00094 argtype3 argname3) \
00095 { \
00096 typedef ret (GLibCallType *p_##func)(argtype1, \
00097 argtype2, \
00098 argtype3); \
00099 p_##func p = (p_##func) GetAddress(#func); \
00100 if (p) \
00101 { \
00102 return p(argname1, argname2, argname3); \
00103 } \
00104 GLibBreakPoint \
00105 return 0; \
00106 }
00107
00108 #define GLibFunc4(ret, func, argtype1, argname1, \
00109 argtype2, argname2, \
00110 argtype3, argname3, \
00111 argtype4, argname4) \
00112 ret func(argtype1 argname1, \
00113 argtype2 argname2, \
00114 argtype3 argname3, \
00115 argtype4 argname4) \
00116 { \
00117 typedef ret (GLibCallType *p_##func)(argtype1, \
00118 argtype2, \
00119 argtype3, \
00120 argtype4); \
00121 p_##func p = (p_##func) GetAddress(#func); \
00122 if (p) \
00123 { \
00124 return p(argname1, argname2, \
00125 argname3, argname4); \
00126 } \
00127 GLibBreakPoint \
00128 return 0; \
00129 }
00130
00131 #define GLibFunc5(ret, func, argtype1, argname1, \
00132 argtype2, argname2, \
00133 argtype3, argname3, \
00134 argtype4, argname4, \
00135 argtype5, argname5) \
00136 ret func(argtype1 argname1, \
00137 argtype2 argname2, \
00138 argtype3 argname3, \
00139 argtype4 argname4, \
00140 argtype5 argname5) \
00141 { \
00142 typedef ret (GLibCallType *p_##func)(argtype1, \
00143 argtype2, \
00144 argtype3, \
00145 argtype4, \
00146 argtype5); \
00147 p_##func p = (p_##func) GetAddress(#func); \
00148 if (p) \
00149 { \
00150 return p(argname1, argname2, \
00151 argname3, argname4, \
00152 argname5); \
00153 } \
00154 GLibBreakPoint \
00155 return 0; \
00156 }
00157
00158
00159 #endif