summaryrefslogtreecommitdiff
path: root/graphics/asymptote/win32helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/win32helpers.h')
-rw-r--r--graphics/asymptote/win32helpers.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/graphics/asymptote/win32helpers.h b/graphics/asymptote/win32helpers.h
new file mode 100644
index 0000000000..266a65f3bd
--- /dev/null
+++ b/graphics/asymptote/win32helpers.h
@@ -0,0 +1,92 @@
+/**
+ * @file win32helpers.h
+ * @brief Windows-specific utility functions header
+ * @author Supakorn "Jamie" Rassameemasmuang (jamievlin [at] outlook.com)
+ */
+
+#pragma once
+
+#if defined(_WIN32)
+
+#include <Windows.h>
+#include "common.h"
+
+namespace camp::w32
+{
+
+/**
+ * Checks if result from ShellExecute/ShellExecuteEx indicates a successful execution or not.
+ * This function does not raise an error in itself, but can generate a warning if specified
+ */
+bool checkShellExecuteResult(INT_PTR shellExecResult, bool reportWarning=false);
+
+void checkResult(BOOL result, string const& message= "");
+void checkLStatus(LSTATUS result, string const& message="");
+
+string buildWindowsCmd(const mem::vector<string>& command);
+
+string getErrorMessage(DWORD const& errorCode);
+
+bool isProcessRunning(DWORD const& pid);
+
+/** Reports error with message from GetLastError and the user specified message */
+void reportAndFailWithLastError(string const& message);
+
+/**
+ * A simple wraper for <tt>HKEY</tt>
+ */
+class RegKeyWrapper
+{
+public:
+ RegKeyWrapper(HKEY const& regKey);
+ RegKeyWrapper();
+
+ ~RegKeyWrapper();
+ RegKeyWrapper(RegKeyWrapper const&) = delete;
+ RegKeyWrapper& operator=(RegKeyWrapper const&) = delete;
+
+ RegKeyWrapper(RegKeyWrapper&& other) noexcept;
+ RegKeyWrapper& operator=(RegKeyWrapper&& other) noexcept;
+
+ /**
+ * @return The registry key held by the wrapper
+ */
+ [[nodiscard]]
+ HKEY getKey() const;
+ PHKEY put();
+
+ void release();
+
+private:
+ void closeExistingKey();
+ HKEY key;
+};
+
+class HandleRaiiWrapper
+{
+public:
+ HandleRaiiWrapper() = default;
+ HandleRaiiWrapper(HANDLE const& handle);
+ ~HandleRaiiWrapper();
+
+ HandleRaiiWrapper(HandleRaiiWrapper const&) = delete;
+ HandleRaiiWrapper& operator=(HandleRaiiWrapper const&) = delete;
+
+ HandleRaiiWrapper(HandleRaiiWrapper&& other) noexcept;
+
+ // already hold a handle, should not consume another one
+ HandleRaiiWrapper& operator=(HandleRaiiWrapper&& other) = delete;
+
+ [[nodiscard]]
+ HANDLE getHandle() const;
+
+ LPHANDLE put();
+
+private:
+ HANDLE hd = nullptr;
+
+};
+
+} // namespace camp::w32
+
+#endif