summaryrefslogtreecommitdiff
path: root/shared/dll_loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'shared/dll_loader.cpp')
-rw-r--r--shared/dll_loader.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/shared/dll_loader.cpp b/shared/dll_loader.cpp
new file mode 100644
index 00000000..6aa48fd7
--- /dev/null
+++ b/shared/dll_loader.cpp
@@ -0,0 +1,61 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#include "dll_loader.h"
+#include <wx/msw/wrapwin.h> //includes "windows.h"
+#include <map>
+#include <cassert>
+
+namespace
+{
+class DllHandler //dynamically load "kernel32.dll"
+{
+public:
+ static DllHandler& getInstance()
+ {
+ static DllHandler instance;
+ return instance;
+ }
+
+ HINSTANCE getHandle(const std::wstring& libraryName)
+ {
+ HandleMap::const_iterator foundEntry = handles.find(libraryName);
+ if (foundEntry == handles.end())
+ {
+ HINSTANCE newHandle = ::LoadLibrary(libraryName.c_str());
+ if (newHandle != NULL)
+ handles.insert(std::make_pair(libraryName, newHandle));
+
+ return newHandle;
+ }
+ else
+ return foundEntry->second;
+ }
+
+private:
+ DllHandler() {}
+
+ ~DllHandler()
+ {
+ for (HandleMap::const_iterator i = handles.begin(); i != handles.end(); ++i)
+ ::FreeLibrary(i->second);
+ }
+
+ typedef std::map<std::wstring, HINSTANCE> HandleMap;
+ HandleMap handles; //only valid handles here!
+};
+}
+
+
+void* util::loadSymbol(const std::wstring& libraryName, const std::string& functionName)
+{
+ const HINSTANCE libHandle = DllHandler::getInstance().getHandle(libraryName);
+
+ if (libHandle != NULL)
+ return reinterpret_cast<void*>(::GetProcAddress(libHandle, functionName.c_str()));
+ else
+ return NULL;
+}
bgstack15