| #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; |
| } |