I think it would be very nice to have something like that to reduce the burden of implementing COM interfaces. This shows for instance on the windows.gaming.input module a 30% LoC reduction (from ~6800 to ~4700), even though the module already had a boilerplate helper macros already.
The MR introduces macros to automatically implement each IUnknown method, as well as all of them at once. It also includes a helper to implement IInspectable methods at once, as well as macros to forward both interface methods to a base interface or an outer object. Last, it provides higher-level macros to implement a main interface and any number of sub interfaces and generate IUnknown, forwarding and vtables for all of them at once, with IInspectable support when needed.
It uses widl to generate additional per-interface macros, for things like inheritance and vtable generation. The rest of the macros are otherwise shared in a Wine-specific header.
The implementation is split to show individual macro being used, although they are later replaced by higher-level macros. The individual helpers are still useful in some corner cases where specific behavior needs to be implemented, or for aggregating classes.
--
v6: widl: Generate return traces for COM classes.
widl: Generate method traces for COM classes.
widl: Generate COM class code for IClassFactory.
windows.gaming.input: Generate the provider COM class.
windows.gaming.input: Generate the vector COM classes.
windows.gaming.input: Generate the async COM classes.
windows.gaming.input: Generate the manager COM classes.
windows.gaming.input: Generate the force feedback COM classes.
windows.gaming.input: Generate the ramp effect COM classes.
windows.gaming.input: Generate the periodic effect COM classes.
windows.gaming.input: Generate the constant effect COM classes.
windows.gaming.input: Generate the condition effect COM classes. (broken)
windows.gaming.input: Generate the racing wheel COM classes.
windows.gaming.input: Generate the gamepad COM classes.
windows.gaming.input: rename controller to raw_controller
widl: Generate initializers for COM classes.
widl: Generate vtables for COM classes.
widl: Generate impl unwrappers for COM classes.
widl: Generate QueryInterface for COM classes.
widl: generate some query interface helpers
widl: Generate default IUnknown / IInspectable implementation.
widl: Generate IUnkonwn and IInspectable forwarding for COM classes.
widl: Generate impl_from helpers for COM classes.
windows.gaming.input: Use the generated COM class structs.
widl: Generate some structs for COM classes.
widl: Parse a widl-specific impl attribute on structs.
makedep: Generate some new impl.h headers from the IDLs.
widl: Generate some new impl.h headers from the IDLs.
windows.gaming.input: Use a separate interface for IAgileObject.
widl: Introduce a new append_declspec helper.
widl: Inline write_args into write_type_right.
widl: Cleanup indentation and variables in write_type_right.
widl: Remove now unnecessary write_callconv argument.
widl: Introduce a new append_type_left helper.
widl: Split write_type_left into a write_type_definition_left helper.
widl: Cleanup indentation and variables in write_type_left.
widl: Introduce a new write_record_type_definition helper.
widl: Move some type name construction out of write_type_left.
widl: Remove unnecessary recursion for TYPE_BITFIELD.
widl: Introduce a new append_basic_type helper.
widl: Wrap strappend parameters in a new struct strbuf.
This merge request has too many patches to be relayed via email.
Please visit the URL below to see the contents of the merge request.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6207
`BluetoothLEAdvertisementWatcher` is required for LE device discovery on WinRT. Several WinRT apps, like Zwift will try getting this interface, and crash if they are not able to.
--
v6: windows.devices.bluetooth: Implement BluetoothLEAdvertisementWatcher::get_{Min, Max}OutOfRangeTimeout.
windows.devices.bluetooth: Implement BluetoothLEAdvertisementWatcher::get_{Min, Max}SamplingInterval.
windows.devices.bluetooth: Add stubs for BluetoothLEAdvertisementWatcher.
windows.devices.bluetooth/tests: Add tests for IBluetoothLEAdvertisementWatcher.
include: Add windows.devices.bluetooth.advertisement.idl.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8654
`BluetoothLEAdvertisementWatcher` is required for LE device discovery on WinRT. Several WinRT apps, like Zwift will try getting this interface, and crash if they are not able to.
--
v5: windows.devices.bluetooth: Implement BluetoothLEAdvertisementWatcher::get_{Min, Max}OutOfRangeTimeout.
windows.devices.bluetooth: Implement BluetoothLEAdvertisementWatcher::get_{Min, Max}SamplingInterval.
windows.devices.bluetooth: Add stubs for BluetoothLEAdvertisementWatcher.
windows.devices.bluetooth/tests: Add tests for IBluetoothLEAdvertisementWatcher.
include: Add windows.devices.bluetooth.advertisement.idl.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8654
Commit 8cd69810596e ("msi: Get system directory just once.") remove call
to GetSystemDirectoryW() in load_fusion_dlls() but forgot to add
corresponding wcscpy() call. This causes loading mscoree.dll to fail,
breaking .NET-assembly-related functionalities. Add it back.
---
Note: it seems like there isn't a test which actually test interactions between msi.dll and GAC/WinSxS. It probably makes sense to add some or modify existing ones.
--
v2: msi: fix .NET assembly-related functionalities due to missed string copy
https://gitlab.winehq.org/wine/wine/-/merge_requests/8756