| // Windows/DLL.h |
| |
| #ifndef ZIP7_INC_WINDOWS_DLL_H |
| #define ZIP7_INC_WINDOWS_DLL_H |
| |
| #include "../Common/MyString.h" |
| |
| #ifndef _WIN32 |
| typedef void * HMODULE; |
| // typedef int (*FARPROC)(); |
| // typedef void *FARPROC; |
| void *GetProcAddress(HMODULE module, LPCSTR procName); |
| #endif |
| |
| namespace NWindows { |
| namespace NDLL { |
| |
| #ifdef _WIN32 |
| |
| /* |
| #ifdef UNDER_CE |
| #define My_GetProcAddress(module, procName) (void *)::GetProcAddressA(module, procName) |
| #else |
| #define My_GetProcAddress(module, procName) (void *)::GetProcAddress(module, procName) |
| #endif |
| */ |
| |
| /* Win32: Don't call CLibrary::Free() and FreeLibrary() from another |
| FreeLibrary() code: detaching code in DLL entry-point or in |
| destructors of global objects in DLL module. */ |
| |
| class CLibrary |
| { |
| HMODULE _module; |
| |
| // Z7_CLASS_NO_COPY(CLibrary); |
| // copy constructor is required here |
| public: |
| CLibrary(): _module(NULL) {} |
| ~CLibrary() { Free(); } |
| |
| CLibrary(const CLibrary &c): _module(NULL) |
| { |
| if (c._module) |
| { |
| // we need non const to reference from original item |
| // c._module = NULL; |
| throw 20230102; |
| } |
| } |
| |
| HMODULE Get_HMODULE() const { return _module; } |
| // operator HMODULE() const { return _module; } |
| // HMODULE* operator&() { return &_module; } |
| bool IsLoaded() const { return (_module != NULL); } |
| |
| void Attach(HMODULE m) |
| { |
| Free(); |
| _module = m; |
| } |
| HMODULE Detach() |
| { |
| const HMODULE m = _module; |
| _module = NULL; |
| return m; |
| } |
| |
| bool Free() throw(); |
| bool LoadEx(CFSTR path, DWORD flags = LOAD_LIBRARY_AS_DATAFILE) throw(); |
| bool Load(CFSTR path) throw(); |
| // FARPROC |
| // void *GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); } |
| }; |
| |
| #else |
| |
| class CLibrary |
| { |
| HMODULE _module; |
| |
| // Z7_CLASS_NO_COPY(CLibrary); |
| public: |
| CLibrary(): _module(NULL) {} |
| ~CLibrary() { Free(); } |
| |
| HMODULE Get_HMODULE() const { return _module; } |
| |
| bool Free() throw(); |
| bool Load(CFSTR path) throw(); |
| // FARPROC |
| // void *GetProc(LPCSTR procName) const; // { return My_GetProcAddress(_module, procName); } |
| }; |
| |
| #endif |
| |
| bool MyGetModuleFileName(FString &path); |
| |
| FString GetModuleDirPrefix(); |
| |
| }} |
| |
| #endif |