summaryrefslogtreecommitdiffstats
path: root/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp')
-rw-r--r--Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp b/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp
new file mode 100644
index 0000000..4ced987
--- /dev/null
+++ b/Utilities/Release/WiX/CustomAction/detect_nsis_overwrite.cpp
@@ -0,0 +1,44 @@
+#include <string>
+#include <vector>
+
+#include <windows.h>
+
+#include <msi.h>
+#include <msiquery.h>
+
+std::wstring get_property(MSIHANDLE msi_handle, std::wstring const& name)
+{
+ DWORD size = 0;
+
+ WCHAR value_buffer[] = L"";
+ UINT status = MsiGetPropertyW(msi_handle, name.c_str(), value_buffer, &size);
+
+ if (status == ERROR_MORE_DATA) {
+ std::vector<wchar_t> buffer(size + 1);
+ MsiGetPropertyW(msi_handle, name.c_str(), &buffer[0], &size);
+ return std::wstring(&buffer[0]);
+ } else {
+ return std::wstring();
+ }
+}
+
+void set_property(MSIHANDLE msi_handle, std::wstring const& name,
+ std::wstring const& value)
+{
+ MsiSetPropertyW(msi_handle, name.c_str(), value.c_str());
+}
+
+extern "C" UINT __stdcall DetectNsisOverwrite(MSIHANDLE msi_handle)
+{
+ std::wstring install_root = get_property(msi_handle, L"INSTALL_ROOT");
+
+ std::wstring uninstall_exe = install_root + L"\\uninstall.exe";
+
+ bool uninstall_exe_exists =
+ GetFileAttributesW(uninstall_exe.c_str()) != INVALID_FILE_ATTRIBUTES;
+
+ set_property(msi_handle, L"CMAKE_NSIS_OVERWRITE_DETECTED",
+ uninstall_exe_exists ? L"1" : L"0");
+
+ return ERROR_SUCCESS;
+}