xref: /aosp_15_r20/external/lzma/CPP/Windows/DLL.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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