1 // Windows/DLL.h 2 3 #ifndef __WINDOWS_DLL_H 4 #define __WINDOWS_DLL_H 5 6 #include "../Common/MyString.h" 7 8 namespace NWindows { 9 namespace NDLL { 10 11 #ifdef _WIN32 12 13 #ifdef UNDER_CE 14 #define My_GetProcAddress(module, procName) (void *)::GetProcAddressA(module, procName) 15 #else 16 #define My_GetProcAddress(module, procName) (void *)::GetProcAddress(module, procName) 17 #endif 18 19 /* Win32: Don't call CLibrary::Free() and FreeLibrary() from another 20 FreeLibrary() code: detaching code in DLL entry-point or in 21 destructors of global objects in DLL module. */ 22 23 class CLibrary 24 { 25 HMODULE _module; 26 27 // CLASS_NO_COPY(CLibrary); 28 public: CLibrary()29 CLibrary(): _module(NULL) {}; ~CLibrary()30 ~CLibrary() { Free(); } 31 HMODULE()32 operator HMODULE() const { return _module; } 33 HMODULE* operator&() { return &_module; } IsLoaded()34 bool IsLoaded() const { return (_module != NULL); } 35 Attach(HMODULE m)36 void Attach(HMODULE m) 37 { 38 Free(); 39 _module = m; 40 } Detach()41 HMODULE Detach() 42 { 43 HMODULE m = _module; 44 _module = NULL; 45 return m; 46 } 47 48 bool Free() throw(); 49 bool LoadEx(CFSTR path, DWORD flags = LOAD_LIBRARY_AS_DATAFILE) throw(); 50 bool Load(CFSTR path) throw(); 51 // FARPROC GetProc(LPCSTR procName)52 void *GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); } 53 }; 54 55 #else 56 57 typedef void * HMODULE; 58 // typedef int (*FARPROC)(); 59 // typedef void *FARPROC; 60 61 class CLibrary 62 { 63 HMODULE _module; 64 65 // CLASS_NO_COPY(CLibrary); 66 public: 67 CLibrary(): _module(NULL) {}; 68 ~CLibrary() { Free(); } 69 70 bool Free() throw(); 71 bool Load(CFSTR path) throw(); 72 // FARPROC 73 void *GetProc(LPCSTR procName) const; // { return My_GetProcAddress(_module, procName); } 74 }; 75 76 #endif 77 78 bool MyGetModuleFileName(FString &path); 79 80 FString GetModuleDirPrefix(); 81 82 }} 83 84 #endif 85