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