misc/libphysfs/lzma/CPP/Windows/DLL.cpp
branchui-scaling
changeset 15283 c4fd2813b127
parent 13390 0135e64c6c66
parent 15279 7ab5cf405686
child 15663 d92eeb468dad
equal deleted inserted replaced
13390:0135e64c6c66 15283:c4fd2813b127
     1 // Windows/DLL.cpp
       
     2 
       
     3 #include "StdAfx.h"
       
     4 
       
     5 #include "DLL.h"
       
     6 #include "Defs.h"
       
     7 #ifndef _UNICODE
       
     8 #include "../Common/StringConvert.h"
       
     9 #endif
       
    10 
       
    11 #ifndef _UNICODE
       
    12 extern bool g_IsNT;
       
    13 #endif
       
    14 
       
    15 namespace NWindows {
       
    16 namespace NDLL {
       
    17 
       
    18 CLibrary::~CLibrary()
       
    19 {
       
    20   Free();
       
    21 }
       
    22 
       
    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 }
       
    34 
       
    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 }
       
    44 
       
    45 bool CLibrary::LoadEx(LPCTSTR fileName, DWORD flags)
       
    46 {
       
    47   // MessageBox(0, fileName, TEXT("LoadEx"), 0);
       
    48   return LoadOperations(::LoadLibraryEx(fileName, NULL, flags));
       
    49 }
       
    50 
       
    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 }
       
    59 
       
    60 #ifndef _UNICODE
       
    61 static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } 
       
    62 CSysString GetSysPath(LPCWSTR sysPath)
       
    63   { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); }
       
    64 
       
    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
       
    78 
       
    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 }
       
    91 
       
    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
       
   114 
       
   115 }}