diff --git a/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs b/src/Files.App.CsWin32/Windows.Win32.ComPtr.cs index a2617f282cff..95fe5650d1a2 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 @@ -39,11 +40,19 @@ 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; - ((IUnknown*)_ptr)->QueryInterface(&riid, (void**)pNewPtr.GetAddressOf()); - return pNewPtr; + ComPtr ptr = default; + Guid iid = typeof(U).GUID; + ((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; + return PInvoke.CoCreateInstance(&clsid, null, dwClsContext, &iid, (void**)this.GetAddressOf()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] 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) { 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;