From 63fee6534bb12c8169dd0c3276a35f51174e23b1 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:46:53 +0000 Subject: [PATCH 1/5] Init --- src/Files.App.CsWin32/Windows.Win32.ComPtr.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs index a2617f282cff..7eee86009140 100644 --- a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs +++ b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs @@ -39,13 +39,20 @@ public ComPtr(T* ptr) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ComPtr As(Guid riid) where U : unmanaged + public readonly ComPtr As() where U : unmanaged { ComPtr pNewPtr = default; + Guid iid = typeof(U).GUID; ((IUnknown*)_ptr)->QueryInterface(&riid, (void**)pNewPtr.GetAddressOf()); return pNewPtr; } + public readonly HRESULT CoCreateInstance(CLSCTX dwClsContext = CLSCTX.CLSCTX_LOCAL_SERVER) where U : unmanaged + { + Guid clsid = typeof(U).GUID, iid = typeof(T).GUID; + return PInvoke.CoCreateInstance(&clsid, null, dwClsContext, &iid, (void**)&_ptr); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Dispose() { From 9a4fd55f6ddae23000a8611320f9abc5361bff58 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:49:17 +0000 Subject: [PATCH 2/5] Use this --- .../Windows/WindowsWallpaperService.cs | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/Files.App/Services/Windows/WindowsWallpaperService.cs b/src/Files.App/Services/Windows/WindowsWallpaperService.cs index ae057c82d774..190d59daa459 100644 --- a/src/Files.App/Services/Windows/WindowsWallpaperService.cs +++ b/src/Files.App/Services/Windows/WindowsWallpaperService.cs @@ -18,16 +18,7 @@ public sealed class WindowsWallpaperService : IWindowsWallpaperService public unsafe void SetDesktopWallpaper(string szPath) { using ComPtr pDesktopWallpaper = default; - var desktopWallpaperIid = typeof(IDesktopWallpaper).GUID; - var desktopWallpaperInstanceIid = typeof(DesktopWallpaper).GUID; - - PInvoke.CoCreateInstance( - &desktopWallpaperInstanceIid, - null, - CLSCTX.CLSCTX_LOCAL_SERVER, - &desktopWallpaperIid, - (void**)pDesktopWallpaper.GetAddressOf()) - .ThrowOnFailure(); + pDesktopWallpaper.CoCreateInstance().ThrowOnFailure(); pDesktopWallpaper.Get()->GetMonitorDevicePathCount(out var dwMonitorCount); @@ -48,16 +39,7 @@ public unsafe void SetDesktopWallpaper(string szPath) public unsafe void SetDesktopSlideshow(string[] aszPaths) { using ComPtr pDesktopWallpaper = default; - var desktopWallpaperIid = typeof(IDesktopWallpaper).GUID; - var desktopWallpaperInstanceIid = typeof(DesktopWallpaper).GUID; - - PInvoke.CoCreateInstance( - &desktopWallpaperInstanceIid, - null, - CLSCTX.CLSCTX_LOCAL_SERVER, - &desktopWallpaperIid, - (void**)pDesktopWallpaper.GetAddressOf()) - .ThrowOnFailure(); + pDesktopWallpaper.CoCreateInstance().ThrowOnFailure(); var dwCount = (uint)aszPaths.Length; From 6843ebf433171cb347b355741552e074ae77f804 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:54:01 +0000 Subject: [PATCH 3/5] Update --- src/Files.App.CsWin32/Windows.Win32.ComPtr.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs index 7eee86009140..f425ae280c64 100644 --- a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs +++ b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs @@ -41,12 +41,13 @@ public ComPtr(T* ptr) [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly ComPtr As() where U : unmanaged { - ComPtr pNewPtr = default; + ComPtr ptr = default; Guid iid = typeof(U).GUID; - ((IUnknown*)_ptr)->QueryInterface(&riid, (void**)pNewPtr.GetAddressOf()); - return pNewPtr; + ((IUnknown*)_ptr)->QueryInterface(&iid, (void**)ptr.GetAddressOf()); + return ptr; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly HRESULT CoCreateInstance(CLSCTX dwClsContext = CLSCTX.CLSCTX_LOCAL_SERVER) where U : unmanaged { Guid clsid = typeof(U).GUID, iid = typeof(T).GUID; From b5b9ec1fbea4966fe4b0e88731fb1c7dc97a2341 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:34:11 +0000 Subject: [PATCH 4/5] Update 2 --- src/Files.App.CsWin32/Windows.Win32.ComPtr.cs | 1 + .../Services/Windows/WindowsDialogService.cs | 24 ++----------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs index f425ae280c64..7bbf7554c7f9 100644 --- a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs +++ b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs @@ -4,6 +4,7 @@ using System; using System.Runtime.CompilerServices; using Windows.Win32; +using Windows.Win32.Foundation; using Windows.Win32.System.Com; namespace Windows.Win32 diff --git a/src/Files.App/Services/Windows/WindowsDialogService.cs b/src/Files.App/Services/Windows/WindowsDialogService.cs index c50e43932cbd..6a40293dff92 100644 --- a/src/Files.App/Services/Windows/WindowsDialogService.cs +++ b/src/Files.App/Services/Windows/WindowsDialogService.cs @@ -23,17 +23,7 @@ public unsafe bool Open_FileOpenDialog(nint hWnd, bool pickFoldersOnly, string[] try { using ComPtr pDialog = default; - var dialogInstanceIid = typeof(FileOpenDialog).GUID; - var dialogIid = typeof(IFileOpenDialog).GUID; - - // Get a new instance of the dialog - HRESULT hr = PInvoke.CoCreateInstance( - &dialogInstanceIid, - null, - CLSCTX.CLSCTX_INPROC_SERVER, - &dialogIid, - (void**)pDialog.GetAddressOf()) - .ThrowOnFailure(); + pDialog.CoCreateInstance(CLSCTX.CLSCTX_INPROC_SERVER).ThrowOnFailure(); if (filters.Length is not 0 && filters.Length % 2 is 0) { @@ -104,17 +94,7 @@ public unsafe bool Open_FileSaveDialog(nint hWnd, bool pickFoldersOnly, string[] try { using ComPtr pDialog = default; - var dialogInstanceIid = typeof(FileSaveDialog).GUID; - var dialogIid = typeof(IFileSaveDialog).GUID; - - // Get a new instance of the dialog - HRESULT hr = PInvoke.CoCreateInstance( - &dialogInstanceIid, - null, - CLSCTX.CLSCTX_INPROC_SERVER, - &dialogIid, - (void**)pDialog.GetAddressOf()) - .ThrowOnFailure(); + pDialog.CoCreateInstance(CLSCTX.CLSCTX_INPROC_SERVER).ThrowOnFailure(); if (filters.Length is not 0 && filters.Length % 2 is 0) { From a68d56de449842bb62c540d758d067d3955119b0 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:45:48 +0000 Subject: [PATCH 5/5] Ugh --- src/Files.App.CsWin32/Windows.Win32.ComPtr.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs index 7bbf7554c7f9..95fe5650d1a2 100644 --- a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs +++ b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs @@ -52,7 +52,7 @@ public readonly ComPtr As() where U : unmanaged public readonly HRESULT CoCreateInstance(CLSCTX dwClsContext = CLSCTX.CLSCTX_LOCAL_SERVER) where U : unmanaged { Guid clsid = typeof(U).GUID, iid = typeof(T).GUID; - return PInvoke.CoCreateInstance(&clsid, null, dwClsContext, &iid, (void**)&_ptr); + return PInvoke.CoCreateInstance(&clsid, null, dwClsContext, &iid, (void**)this.GetAddressOf()); } [MethodImpl(MethodImplOptions.AggressiveInlining)]