ezEngine  Milestone 7
Plugin_Win.h
1 
2 #if EZ_ENABLED(EZ_PLATFORM_WINDOWS)
3 
5  #include <Foundation/Strings/StringBuilder.h>
6  #include <Foundation/IO/OSFile.h>
7  #include <Foundation/Logging/Log.h>
8 
9  typedef HMODULE ezPluginModule;
10 
11  void ezPlugin::GetPluginPaths(const char* szPluginName, ezStringBuilder& sOldPath, ezStringBuilder& sNewPath, ezUInt8 uiFileNumber)
12  {
14  sOldPath.AppendPath(szPluginName);
15  sOldPath.Append(".dll");
16 
18  sNewPath.AppendPath(szPluginName);
19 
20  if (uiFileNumber > 0)
21  sNewPath.AppendFormat("%i", uiFileNumber);
22 
23  sNewPath.Append(".loaded");
24  }
25 
26  ezResult UnloadPluginModule(ezPluginModule& Module, const char* szPluginFile)
27  {
28  // reset last error code
29  if (GetLastError()) { }
30 
31  if (FreeLibrary(Module) == FALSE)
32  {
33  DWORD err = GetLastError();
34 
35  LPVOID lpMsgBuf = nullptr;
36 
37  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr,
38  err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, nullptr);
39 
40  ezLog::Error("Could not unload plugin '%s'. Error-Code %u (\"%s\")", szPluginFile, err, lpMsgBuf);
41 
42  LocalFree(lpMsgBuf);
43 
44  return EZ_FAILURE;
45  }
46 
47  Module = nullptr;
48  return EZ_SUCCESS;
49  }
50 
51  ezResult LoadPluginModule(const char* szFileToLoad, ezPluginModule& Module, const char* szPluginFile)
52  {
53  // reset last error code
54  if (GetLastError()) { }
55 
56  Module = LoadLibraryW(ezStringWChar(szFileToLoad).GetData());
57 
58  if (Module == nullptr)
59  {
60  DWORD err = GetLastError();
61 
62  LPVOID lpMsgBuf = nullptr;
63 
64  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr,
65  err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, nullptr);
66 
67  if (ezUnicodeUtils::IsValidUtf8((const char*) lpMsgBuf)) // happens on localized systems
68  ezLog::Error("Could not load plugin '%s'. Error-Code %u / 0x%08X (\"%s\")", szPluginFile, err, err, lpMsgBuf);
69  else
70  ezLog::Error("Could not load plugin '%s'. Error-Code %u / 0x%08X", szPluginFile, err, err);
71 
72  LocalFree(lpMsgBuf);
73 
74  return EZ_FAILURE;
75  }
76 
77  return EZ_SUCCESS;
78  }
79 
80 #else
81  #error "This file should not have been included."
82 #endif
83