Fri, 16 Jan 2015 18:13:44 +0100
Integrate suggestion from review to improve consistency with existing code.
1 // Windows/DLL.cpp
3 #include "StdAfx.h"
5 #include "DLL.h"
6 #include "Defs.h"
7 #ifndef _UNICODE
8 #include "../Common/StringConvert.h"
9 #endif
11 #ifndef _UNICODE
12 extern bool g_IsNT;
13 #endif
15 namespace NWindows {
16 namespace NDLL {
18 CLibrary::~CLibrary()
19 {
20 Free();
21 }
23 bool CLibrary::Free()
24 {
25 if (_module == 0)
26 return true;
27 // MessageBox(0, TEXT(""), TEXT("Free"), 0);
28 // Sleep(5000);
29 if (!::FreeLibrary(_module))
30 return false;
31 _module = 0;
32 return true;
33 }
35 bool CLibrary::LoadOperations(HMODULE newModule)
36 {
37 if (newModule == NULL)
38 return false;
39 if(!Free())
40 return false;
41 _module = newModule;
42 return true;
43 }
45 bool CLibrary::LoadEx(LPCTSTR fileName, DWORD flags)
46 {
47 // MessageBox(0, fileName, TEXT("LoadEx"), 0);
48 return LoadOperations(::LoadLibraryEx(fileName, NULL, flags));
49 }
51 bool CLibrary::Load(LPCTSTR fileName)
52 {
53 // MessageBox(0, fileName, TEXT("Load"), 0);
54 // Sleep(5000);
55 // OutputDebugString(fileName);
56 // OutputDebugString(TEXT("\n"));
57 return LoadOperations(::LoadLibrary(fileName));
58 }
60 #ifndef _UNICODE
61 static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; }
62 CSysString GetSysPath(LPCWSTR sysPath)
63 { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); }
65 bool CLibrary::LoadEx(LPCWSTR fileName, DWORD flags)
66 {
67 if (g_IsNT)
68 return LoadOperations(::LoadLibraryExW(fileName, NULL, flags));
69 return LoadEx(GetSysPath(fileName), flags);
70 }
71 bool CLibrary::Load(LPCWSTR fileName)
72 {
73 if (g_IsNT)
74 return LoadOperations(::LoadLibraryW(fileName));
75 return Load(GetSysPath(fileName));
76 }
77 #endif
79 bool MyGetModuleFileName(HMODULE hModule, CSysString &result)
80 {
81 result.Empty();
82 TCHAR fullPath[MAX_PATH + 2];
83 DWORD size = ::GetModuleFileName(hModule, fullPath, MAX_PATH + 1);
84 if (size <= MAX_PATH && size != 0)
85 {
86 result = fullPath;
87 return true;
88 }
89 return false;
90 }
92 #ifndef _UNICODE
93 bool MyGetModuleFileName(HMODULE hModule, UString &result)
94 {
95 result.Empty();
96 if (g_IsNT)
97 {
98 wchar_t fullPath[MAX_PATH + 2];
99 DWORD size = ::GetModuleFileNameW(hModule, fullPath, MAX_PATH + 1);
100 if (size <= MAX_PATH && size != 0)
101 {
102 result = fullPath;
103 return true;
104 }
105 return false;
106 }
107 CSysString resultSys;
108 if (!MyGetModuleFileName(hModule, resultSys))
109 return false;
110 result = MultiByteToUnicodeString(resultSys, GetCurrentCodePage());
111 return true;
112 }
113 #endif
115 }}