12 #include "cores/DllLoader/LibraryLoader.h" 28 #define DECLARE_DLL_WRAPPER(classname, dllname) \ 29 XDECLARE_DLL_WRAPPER(classname,dllname) 31 #define XDECLARE_DLL_WRAPPER(classname, dllname) \ 33 classname () : DllDynamic( dllname ) {} 48 #define DECLARE_DLL_WRAPPER_TEMPLATE(classname) \ 58 #define LOAD_SYMBOLS() \ 60 virtual bool LoadSymbols() { return true; } 73 #define DEFINE_GLOBAL_PTR(type, name) \ 77 void* m_##name##_ptr; \ 80 virtual type* Get_##name (void) \ 85 #define DEFINE_GLOBAL(type, name) \ 89 void* m_##name##_ptr; \ 92 virtual type Get_##name (void) \ 110 #define DEFINE_METHOD_LINKAGE_FP(result, linkage, name, args) \ 112 typedef result (linkage * name##_METHOD) args; \ 115 name##_METHOD m_##name; \ 116 void* m_##name##_ptr; \ 119 #define DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, args2) \ 121 typedef result (linkage * name##_METHOD) args; \ 123 name##_METHOD m_##name; \ 124 void* m_##name##_ptr; \ 127 virtual result name args override \ 129 return m_##name ? m_##name args2 : (result) 0; \ 132 #define DEFINE_METHOD_LINKAGE0(result, linkage, name) \ 133 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, () , ()) 135 #define DEFINE_METHOD_LINKAGE1(result, linkage, name, args) \ 136 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1)) 138 #define DEFINE_METHOD_LINKAGE2(result, linkage, name, args) \ 139 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2)) 141 #define DEFINE_METHOD_LINKAGE3(result, linkage, name, args) \ 142 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3)) 144 #define DEFINE_METHOD_LINKAGE4(result, linkage, name, args) \ 145 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4)) 147 #define DEFINE_METHOD_LINKAGE5(result, linkage, name, args) \ 148 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5)) 150 #define DEFINE_METHOD_LINKAGE6(result, linkage, name, args) \ 151 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6)) 153 #define DEFINE_METHOD_LINKAGE7(result, linkage, name, args) \ 154 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7)) 156 #define DEFINE_METHOD_LINKAGE8(result, linkage, name, args) \ 157 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8)) 159 #define DEFINE_METHOD_LINKAGE9(result, linkage, name, args) \ 160 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8, p9)) 162 #define DEFINE_METHOD_LINKAGE10(result, linkage, name, args) \ 163 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)) 165 #define DEFINE_METHOD_LINKAGE11(result, linkage, name, args) \ 166 DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)) 181 #define DEFINE_METHOD_FP(result, name, args) DEFINE_METHOD_LINKAGE_FP(result, __cdecl, name, args) 197 #define DEFINE_METHOD0(result, name) DEFINE_METHOD_LINKAGE0(result, __cdecl, name) 198 #define DEFINE_METHOD1(result, name, args) DEFINE_METHOD_LINKAGE1(result, __cdecl, name, args) 199 #define DEFINE_METHOD2(result, name, args) DEFINE_METHOD_LINKAGE2(result, __cdecl, name, args) 200 #define DEFINE_METHOD3(result, name, args) DEFINE_METHOD_LINKAGE3(result, __cdecl, name, args) 201 #define DEFINE_METHOD4(result, name, args) DEFINE_METHOD_LINKAGE4(result, __cdecl, name, args) 202 #define DEFINE_METHOD5(result, name, args) DEFINE_METHOD_LINKAGE5(result, __cdecl, name, args) 203 #define DEFINE_METHOD6(result, name, args) DEFINE_METHOD_LINKAGE6(result, __cdecl, name, args) 204 #define DEFINE_METHOD7(result, name, args) DEFINE_METHOD_LINKAGE7(result, __cdecl, name, args) 205 #define DEFINE_METHOD8(result, name, args) DEFINE_METHOD_LINKAGE8(result, __cdecl, name, args) 206 #define DEFINE_METHOD9(result, name, args) DEFINE_METHOD_LINKAGE9(result, __cdecl, name, args) 207 #define DEFINE_METHOD10(result, name, args) DEFINE_METHOD_LINKAGE10(result, __cdecl, name, args) 208 #define DEFINE_METHOD11(result, name, args) DEFINE_METHOD_LINKAGE11(result, __cdecl, name, args) 210 #ifdef TARGET_WINDOWS 240 #define ALS(a) ((sizeof(a)+3)&~3) 241 #define DEFINE_FUNC_PART1(result, linkage, name, args) \ 243 typedef result (linkage * name##_type)##args; \ 245 name##_type m_##name; \ 246 void* m_##name##_ptr; \ 249 virtual result name##args 251 #define DEFINE_FUNC_PART2(size) \ 261 #define DEFINE_FUNC_PART3(name,args) \ 268 #define DEFINE_FUNC_ALIGNED0(result, linkage, name) \ 269 DEFINE_FUNC_PART1(result, linkage, name, ()) \ 270 DEFINE_FUNC_PART2(0) \ 271 DEFINE_FUNC_PART3(name,()) 273 #define DEFINE_FUNC_ALIGNED1(result, linkage, name, t1) \ 274 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1)) \ 275 DEFINE_FUNC_PART2(ALS(p1)) \ 276 DEFINE_FUNC_PART3(name,(p1)) 278 #define DEFINE_FUNC_ALIGNED2(result, linkage, name, t1, t2) \ 279 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2)) \ 280 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)) \ 281 DEFINE_FUNC_PART3(name,(p1, p2)) 283 #define DEFINE_FUNC_ALIGNED3(result, linkage, name, t1, t2, t3) \ 284 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3)) \ 285 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)) \ 286 DEFINE_FUNC_PART3(name,(p1, p2, p3)) 288 #define DEFINE_FUNC_ALIGNED4(result, linkage, name, t1, t2, t3, t4) \ 289 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4)) \ 290 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)) \ 291 DEFINE_FUNC_PART3(name,(p1, p2, p3, p4)) 293 #define DEFINE_FUNC_ALIGNED5(result, linkage, name, t1, t2, t3, t4, t5) \ 294 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5)) \ 295 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)) \ 296 DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5)) 298 #define DEFINE_FUNC_ALIGNED6(result, linkage, name, t1, t2, t3, t4, t5, t6) \ 299 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6)) \ 300 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)) \ 301 DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6)) 303 #define DEFINE_FUNC_ALIGNED7(result, linkage, name, t1, t2, t3, t4, t5, t6, t7) \ 304 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7)) \ 305 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)+ALS(p7)) \ 306 DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6, p7)) 308 #define DEFINE_FUNC_ALIGNED8(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8) \ 309 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8)) \ 310 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)+ALS(p7)+ALS(p8)) \ 311 DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6, p7, p8)) 313 #define DEFINE_FUNC_ALIGNED9(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ 314 DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9)) \ 315 DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)+ALS(p7)+ALS(p8)+ALS(p9)) \ 316 DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6, p7, p8, p9)) 320 #define DEFINE_FUNC_ALIGNED0(result, linkage, name) DEFINE_METHOD_LINKAGE0 (result, linkage, name) 321 #define DEFINE_FUNC_ALIGNED1(result, linkage, name, t1) DEFINE_METHOD_LINKAGE1 (result, linkage, name, (t1 p1) ) 322 #define DEFINE_FUNC_ALIGNED2(result, linkage, name, t1, t2) DEFINE_METHOD_LINKAGE2 (result, linkage, name, (t1 p1, t2 p2) ) 323 #define DEFINE_FUNC_ALIGNED3(result, linkage, name, t1, t2, t3) DEFINE_METHOD_LINKAGE3 (result, linkage, name, (t1 p1, t2 p2, t3 p3) ) 324 #define DEFINE_FUNC_ALIGNED4(result, linkage, name, t1, t2, t3, t4) DEFINE_METHOD_LINKAGE4 (result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4) ) 325 #define DEFINE_FUNC_ALIGNED5(result, linkage, name, t1, t2, t3, t4, t5) DEFINE_METHOD_LINKAGE5 (result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5) ) 326 #define DEFINE_FUNC_ALIGNED6(result, linkage, name, t1, t2, t3, t4, t5, t6) DEFINE_METHOD_LINKAGE6 (result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6) ) 327 #define DEFINE_FUNC_ALIGNED7(result, linkage, name, t1, t2, t3, t4, t5, t6, t7) DEFINE_METHOD_LINKAGE7 (result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7) ) 328 #define DEFINE_FUNC_ALIGNED8(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8) DEFINE_METHOD_LINKAGE8 (result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8) ) 329 #define DEFINE_FUNC_ALIGNED9(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8, t9) DEFINE_METHOD_LINKAGE9 (result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9) ) 330 #define DEFINE_FUNC_ALIGNED10(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8, t10) DEFINE_METHOD_LINKAGE10(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10) ) 331 #define DEFINE_FUNC_ALIGNED11(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8, t10, t11) DEFINE_METHOD_LINKAGE11(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11) ) 345 #define BEGIN_METHOD_RESOLVE() \ 347 virtual bool ResolveExports() override \ 350 #define END_METHOD_RESOLVE() \ 363 #define RESOLVE_METHOD(method) \ 364 if (!m_dll->ResolveExport( #method , & m_##method##_ptr )) \ 367 #define RESOLVE_METHOD_FP(method) \ 368 if (!m_dll->ResolveExport( #method , & m_##method##_ptr )) \ 383 #define RESOLVE_METHOD_OPTIONAL(method) \ 384 m_##method##_ptr = nullptr; \ 385 m_dll->ResolveExport( #method , & m_##method##_ptr, false ); 387 #define RESOLVE_METHOD_OPTIONAL_FP(method) \ 388 m_##method##_ptr = NULL; \ 389 m_dll->ResolveExport( #method , & m_##method##_ptr, false ); 403 #define RESOLVE_METHOD_RENAME(dllmethod, method) \ 404 if (!m_dll->ResolveExport( #dllmethod , & m_##method##_ptr )) \ 407 #define RESOLVE_METHOD_RENAME_OPTIONAL(dllmethod, method) \ 408 m_##method##_ptr = nullptr; \ 409 m_dll->ResolveExport( #dllmethod , & m_##method##_ptr, false ); 411 #define RESOLVE_METHOD_RENAME_FP(dllmethod, method) \ 412 if (!m_dll->ResolveExport( #dllmethod , & method##_ptr )) \ 518 explicit DllDynamic(
const std::string& strDllName);
521 virtual void Unload();
522 virtual bool IsLoaded()
const {
return m_dll!=NULL; }
524 bool EnableDelayedUnload(
bool bOnOff);
525 bool SetFile(
const std::string& strDllName);
526 const std::string &GetFile()
const {
return m_strDllName; }
529 virtual bool ResolveExports()=0;
530 virtual bool LoadSymbols() {
return false; }
533 std::string m_strDllName;
Definition: LibraryLoader.h:17
Definition: DynamicDll.h:514