• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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