Bug 1287002: Add DynamicallyLinkedFunctionPtr helper class to mscom glue; r?jimm draft
authorAaron Klotz <aklotz@mozilla.com>
Fri, 03 Jun 2016 12:56:24 -0600
changeset 389246 d349a1c78429b94ff1192d40df58fc6cb57c74eb
parent 389245 8c06135fc77955daae1882eeb1034733ebc5802a
child 389247 cccfc83371d5dbe094a44198f2f2d77c7f2f70cd
child 389365 3ec8d3b5c770009122cf385fa634413b2202489f
push id23333
push useraklotz@mozilla.com
push dateMon, 18 Jul 2016 20:50:01 +0000
reviewersjimm
bugs1287002
milestone50.0a1
Bug 1287002: Add DynamicallyLinkedFunctionPtr helper class to mscom glue; r?jimm MozReview-Commit-ID: JnsXxi3oQ9r
ipc/mscom/DynamicallyLinkedFunctionPtr.h
new file mode 100644
--- /dev/null
+++ b/ipc/mscom/DynamicallyLinkedFunctionPtr.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_mscom_DynamicallyLinkedFunctionPtr_h
+#define mozilla_mscom_DynamicallyLinkedFunctionPtr_h
+
+#include "mozilla/Move.h"
+#include <windows.h>
+
+namespace mozilla {
+namespace mscom {
+
+template <typename T>
+class DynamicallyLinkedFunctionPtr;
+
+template <typename R, typename... Args>
+class DynamicallyLinkedFunctionPtr<R (__stdcall*)(Args...)>
+{
+  typedef R (__stdcall* FunctionPtrT)(Args...);
+
+public:
+  DynamicallyLinkedFunctionPtr(const wchar_t* aLibName, const char* aFuncName)
+    : mModule(NULL)
+    , mFunction(nullptr)
+  {
+    mModule = ::LoadLibraryW(aLibName);
+    if (mModule) {
+      mFunction = reinterpret_cast<FunctionPtrT>(
+                    ::GetProcAddress(mModule, aFuncName));
+    }
+  }
+
+  DynamicallyLinkedFunctionPtr(const DynamicallyLinkedFunctionPtr&) = delete;
+  DynamicallyLinkedFunctionPtr& operator=(const DynamicallyLinkedFunctionPtr&) = delete;
+
+  DynamicallyLinkedFunctionPtr(DynamicallyLinkedFunctionPtr&&) = delete;
+  DynamicallyLinkedFunctionPtr& operator=(DynamicallyLinkedFunctionPtr&&) = delete;
+
+  ~DynamicallyLinkedFunctionPtr()
+  {
+    if (mModule) {
+      ::FreeLibrary(mModule);
+    }
+  }
+
+  R operator()(Args... args)
+  {
+    return mFunction(mozilla::Forward<Args>(args)...);
+  }
+
+  explicit operator bool() const
+  {
+    return !!mFunction;
+  }
+
+private:
+  HMODULE       mModule;
+  FunctionPtrT  mFunction;
+};
+
+} // namespace mscom
+} // namespace mozilla
+
+#endif // mozilla_mscom_DynamicallyLinkedFunctionPtr_h
+