| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #include <windows.h>
- #include <msi.h>
- #include <msiquery.h>
- #include <string>
- #include <vector>
- 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;
- }
|