* Initial Windows taskbar progress support
* Changes to COM (un)init
It turns out winapi exposes IIDs through a `uuidof()` function of interfaces, so the copied one can be removed.
* Don't return error codes
Now the `TaskbarProgress` functions fail silently.
The `TaskbarProgress` struct now will always be created (even in case of errors in initialisation), but it won't do anything.
* Fix builds for other systems
* Formatted code
* Fix progress shown after the operation finished
A progress update was received after the stop event.
Also `as_ref()` was removed in many places (I don't even know why it was there).
* Remove redundant call to hide
It's already called by the `glib_stop_receiver` receiver.
* Release the ITaskbarList3 and call CoUninitialize at exit
Because objects moved to closures used as fallbacks in GTK have [static lifetimes](https://gtk-rs.org/docs-src/tutorial/closures#closures), the `TaskbarProgress` will never be dropped.
To workaround this problem a `release` function is called when the main window is closed. This function behaves like `drop`, but sets the struct in a valid "empty" state, so that calling `release`/`drop` again won't cause problems.
* Don't set the NORMAL state manually
Because only NOPROGRESS and INDETERMINATE states are used, there is no need to set the NORMAL state when changing the progress value.
Now `set_progress_value` will also change the `TaskbarProgress::current_state` if such situation occurs.
> Unless [SetProgressState](https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-itaskbarlist3-setprogressstate)
> has set a blocking state (TBPF_ERROR or TBPF_PAUSED) for the window, a call to **SetProgressValue** assumes the TBPF_NORMAL
> state even if it is not explicitly set. A call to **SetProgressValue** overrides and clears the TBPF_INDETERMINATE state.
See the [SetProgressValue documentation](https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-itaskbarlist3-setprogressvalue#how-the-taskbar-button-chooses-the-progress-indicator-for-a-group)
If the user could not create a hard link (due to permissions or
different block devices) then czkawka lost the duplicate file.
```
$ mkdir hardlink
$ cd hardlink
$ echo a > a
$ cp a b
$ chown thetestuser:thetestuser a
$ ls -il .
25169246 -rw-rw-r-- 1 thetestuser thetestuser 2 Feb 7 11:18 a
25169641 -rw-rw-r-- 1 thomas thomas 2 Feb 7 11:18 b
$ cargo run --bin czkawka_cli dup --directories $(pwd) -m 1 -f
test101.result --delete-method HARD
[...]
-------------------------------WARNINGS--------------------------------
Failed to link /home/thomas/Development/czkawka/hardlink/b ->
/home/thomas/Development/czkawka/hardlink/a
---------------------------END OF WARNINGS-----------------------------
$ ls -il .
25169246 -rw-rw-r-- 1 thetestuser thetestuser 2 Feb 7 11:18 a
```
Now czkawka keeps all files and the warning provides more information
why czkawka can't replace the duplicate with a hard link.
```
$ cargo run --bin czkawka_cli dup --directories $(pwd) -m 1 -f
test101.result --delete-method HARD
-------------------------------WARNINGS--------------------------------
Failed to link /home/thomas/Development/czkawka/hardlink/b ->
/home/thomas/Development/czkawka/hardlink/a (Operation not permitted (os
error 1))
---------------------------END OF WARNINGS-----------------------------
[...]
25169246 -rw-rw-r-- 1 thetestuser thetestuser 2 Feb 7 11:18 a
25169641 -rw-rw-r-- 1 thomas thomas 2 Feb 7 11:18 b
```