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