From 1380a5593522f923396eb0d870bd86d719d07f32 Mon Sep 17 00:00:00 2001 From: srkizer Date: Wed, 24 Jul 2024 04:01:41 +0900 Subject: [PATCH] ReShade related fixes (#1963) * Handle ReShadeAddonInterface ctor exceptions * Lower ReShadeApiVersion to 1 * fixes --- .../ReShadeHandling/ReShadeAddonInterface.cs | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs b/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs index de7629276..372928725 100644 --- a/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs +++ b/Dalamud/Interface/Internal/ReShadeHandling/ReShadeAddonInterface.cs @@ -15,7 +15,7 @@ namespace Dalamud.Interface.Internal.ReShadeHandling; /// ReShade interface. internal sealed unsafe partial class ReShadeAddonInterface : IDisposable { - private const int ReShadeApiVersion = 12; + private const int ReShadeApiVersion = 1; private readonly HMODULE hDalamudModule; @@ -25,6 +25,8 @@ internal sealed unsafe partial class ReShadeAddonInterface : IDisposable private readonly DelegateStorage initSwapChainDelegate; private readonly DelegateStorage destroySwapChainDelegate; + private bool requiresFinalize; + private ReShadeAddonInterface() { this.hDalamudModule = (HMODULE)Marshal.GetHINSTANCE(typeof(ReShadeAddonInterface).Assembly.ManifestModule); @@ -40,16 +42,37 @@ internal sealed unsafe partial class ReShadeAddonInterface : IDisposable 0, this.GetModuleHandleExWDetour); - this.addonModuleResolverHook.Enable(); - Exports.ReShadeRegisterEvent( - AddonEvent.ReShadeOverlay, - this.reShadeOverlayDelegate = new((ref ApiObject rt) => this.ReShadeOverlay?.Invoke(ref rt))); - Exports.ReShadeRegisterEvent( - AddonEvent.InitSwapChain, - this.initSwapChainDelegate = new((ref ApiObject rt) => this.InitSwapChain?.Invoke(ref rt))); - Exports.ReShadeRegisterEvent( - AddonEvent.DestroySwapChain, - this.destroySwapChainDelegate = new((ref ApiObject rt) => this.DestroySwapChain?.Invoke(ref rt))); + try + { + this.addonModuleResolverHook.Enable(); + Exports.ReShadeRegisterEvent( + AddonEvent.ReShadeOverlay, + this.reShadeOverlayDelegate = new((ref ApiObject rt) => this.ReShadeOverlay?.Invoke(ref rt))); + Exports.ReShadeRegisterEvent( + AddonEvent.InitSwapChain, + this.initSwapChainDelegate = new((ref ApiObject rt) => this.InitSwapChain?.Invoke(ref rt))); + Exports.ReShadeRegisterEvent( + AddonEvent.DestroySwapChain, + this.destroySwapChainDelegate = new((ref ApiObject rt) => this.DestroySwapChain?.Invoke(ref rt))); + } + catch (Exception e1) + { + Exports.ReShadeUnregisterAddon(this.hDalamudModule); + + try + { + this.addonModuleResolverHook.Disable(); + this.addonModuleResolverHook.Dispose(); + } + catch (Exception e2) + { + throw new AggregateException(e1, e2); + } + + throw; + } + + this.requiresFinalize = true; } /// Finalizes an instance of the class. @@ -104,9 +127,10 @@ internal sealed unsafe partial class ReShadeAddonInterface : IDisposable private void ReleaseUnmanagedResources() { - Exports.ReShadeUnregisterEvent(AddonEvent.InitSwapChain, this.initSwapChainDelegate); - Exports.ReShadeUnregisterEvent(AddonEvent.DestroySwapChain, this.destroySwapChainDelegate); - Exports.ReShadeUnregisterEvent(AddonEvent.ReShadeOverlay, this.reShadeOverlayDelegate); + if (!this.requiresFinalize) + return; + this.requiresFinalize = false; + // This will also unregister addon event registrations. Exports.ReShadeUnregisterAddon(this.hDalamudModule); this.addonModuleResolverHook.Disable(); this.addonModuleResolverHook.Dispose();