From d4b56f99ff235e0b5445c9f8064f85d313e7434d Mon Sep 17 00:00:00 2001 From: Alekhya Date: Fri, 15 May 2020 08:49:44 -0700 Subject: [PATCH] [launcher] Remove Program Plugin dll (AppxPackagingTlb.dll) (#3037) * Removed AppxPackaging dll * Added helper class and fixed some AppxPackage errors * Modified it to use the COM interface * Got it to build without errors but UWP apps don't show up * Added app to the array * Deleted the AppxPackaging.dll * Added github reference * Removed unnecessary uwp app argument * Removed dll from installer wxs file --- installer/PowerToysSetup/Product.wxs | 2 +- .../AppxPackagingTlb.dll | Bin 17408 -> 0 bytes .../Microsoft.Plugin.Program.csproj | 11 --- .../Programs/AppxPackageHelper.cs | 82 ++++++++++++++++++ .../Microsoft.Plugin.Program/Programs/UWP.cs | 67 ++++++++------ 5 files changed, 122 insertions(+), 40 deletions(-) delete mode 100644 src/modules/launcher/Plugins/Microsoft.Plugin.Program/AppxPackagingTlb.dll create mode 100644 src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/AppxPackageHelper.cs diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs index 8fd73068e0..2ff4c033f0 100644 --- a/installer/PowerToysSetup/Product.wxs +++ b/installer/PowerToysSetup/Product.wxs @@ -854,7 +854,7 @@ - + diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/AppxPackagingTlb.dll b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/AppxPackagingTlb.dll deleted file mode 100644 index 183cfc085c378e7b1927d3354d65d7206e15c978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 HW#InPreserveNewest - - - - .\AppxPackagingTlb.dll - True - - - .\ShObjIdlTlb.dll - True - - diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/AppxPackageHelper.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/AppxPackageHelper.cs new file mode 100644 index 0000000000..f9605a574a --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/AppxPackageHelper.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using Windows.Storage; + +namespace Microsoft.Plugin.Program.Programs +{ + public class AppxPackageHelper + { + // This function returns a list of attributes of applications + public List getAppsFromManifest(IStream stream) + { + List apps = new List(); + var appxFactory = new AppxFactory(); + var reader = ((IAppxFactory)appxFactory).CreateManifestReader(stream); + var manifestApps = reader.GetApplications(); + while (manifestApps.GetHasCurrent()) + { + string appListEntry; + var manifestApp = manifestApps.GetCurrent(); + manifestApp.GetStringValue("AppListEntry", out appListEntry); + if (appListEntry != "none") + { + apps.Add(manifestApp); + } + manifestApps.MoveNext(); + } + return apps; + } + + // Reference : https://stackoverflow.com/questions/32122679/getting-icon-of-modern-windows-app-from-a-desktop-application + [Guid("5842a140-ff9f-4166-8f5c-62f5b7b0c781"), ComImport] + public class AppxFactory + { + } + + [Guid("BEB94909-E451-438B-B5A7-D79E767B75D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IAppxFactory + { + void _VtblGap0_2(); // skip 2 methods + IAppxManifestReader CreateManifestReader(IStream inputStream); + } + + [Guid("4E1BD148-55A0-4480-A3D1-15544710637C"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IAppxManifestReader + { + void _VtblGap0_1(); // skip 1 method + IAppxManifestProperties GetProperties(); + void _VtblGap1_5(); // skip 5 methods + IAppxManifestApplicationsEnumerator GetApplications(); + } + + [Guid("9EB8A55A-F04B-4D0D-808D-686185D4847A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IAppxManifestApplicationsEnumerator + { + IAppxManifestApplication GetCurrent(); + bool GetHasCurrent(); + bool MoveNext(); + } + + [Guid("5DA89BF4-3773-46BE-B650-7E744863B7E8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IAppxManifestApplication + { + [PreserveSig] + int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string name, [MarshalAs(UnmanagedType.LPWStr)] out string value); + + [PreserveSig] + int GetAppUserModelId([MarshalAs(UnmanagedType.LPWStr)] out string value); + } + + [Guid("03FAF64D-F26F-4B2C-AAF7-8FE7789B8BCA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IAppxManifestProperties + { + [PreserveSig] + int GetBoolValue([MarshalAs(UnmanagedType.LPWStr)]string name, out bool value); + [PreserveSig] + int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string name, [MarshalAs(UnmanagedType.LPWStr)] out string value); + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs index 58571f695e..740044836b 100644 --- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs +++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/UWP.cs @@ -10,10 +10,8 @@ using System.Threading.Tasks; using System.Xml.Linq; using Windows.ApplicationModel; using Windows.Management.Deployment; -using AppxPackaing; using Wox.Infrastructure; using Microsoft.Plugin.Program.Logger; -using IStream = AppxPackaing.IStream; using Rect = System.Windows.Rect; using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Media; @@ -21,6 +19,7 @@ using System.Windows.Controls; using Wox.Plugin; using System.Reflection; using Wox.Plugin.SharedCommands; +using System.Runtime.InteropServices.ComTypes; namespace Microsoft.Plugin.Program.Programs { @@ -54,33 +53,28 @@ namespace Microsoft.Plugin.Program.Programs private void InitializeAppInfo() { + AppxPackageHelper _helper = new AppxPackageHelper(); var path = Path.Combine(Location, "AppxManifest.xml"); var namespaces = XmlNamespaces(path); InitPackageVersion(namespaces); - var appxFactory = new AppxFactory(); IStream stream; const uint noAttribute = 0x80; const Stgm exclusiveRead = Stgm.Read | Stgm.ShareExclusive; var hResult = SHCreateStreamOnFileEx(path, exclusiveRead, noAttribute, false, null, out stream); if (hResult == Hresult.Ok) - { - var reader = appxFactory.CreateManifestReader(stream); - var manifestApps = reader.GetApplications(); - var apps = new List(); - while (manifestApps.GetHasCurrent() != 0) - { - var manifestApp = manifestApps.GetCurrent(); - var appListEntry = manifestApp.GetStringValue("AppListEntry"); - if (appListEntry != "none") - { - var app = new Application(manifestApp, this); - apps.Add(app); - } - manifestApps.MoveNext(); - } + { + var apps = new List(); + + List _apps = _helper.getAppsFromManifest(stream); + foreach(var _app in _apps) + { + var app = new Application(_app, this); + apps.Add(app); + } + Apps = apps.Where(a => a.AppListEntry != "none").ToArray(); } else @@ -382,16 +376,32 @@ namespace Microsoft.Plugin.Program.Programs }); } - public Application(IAppxManifestApplication manifestApp, UWP package) + public Application(AppxPackageHelper.IAppxManifestApplication manifestApp, UWP package) { - UserModelId = manifestApp.GetAppUserModelId(); - UniqueIdentifier = manifestApp.GetAppUserModelId(); - DisplayName = manifestApp.GetStringValue("DisplayName"); - Description = manifestApp.GetStringValue("Description"); - BackgroundColor = manifestApp.GetStringValue("BackgroundColor"); + // This is done because we cannot use the keyword 'out' along with a property + string tmpUserModelId; + string tmpUniqueIdentifier; + string tmpDisplayName; + string tmpDescription; + string tmpBackgroundColor; + string tmpEntryPoint; + + manifestApp.GetAppUserModelId(out tmpUserModelId); + manifestApp.GetAppUserModelId(out tmpUniqueIdentifier); + manifestApp.GetStringValue("DisplayName", out tmpDisplayName); + manifestApp.GetStringValue("Description", out tmpDescription); + manifestApp.GetStringValue("BackgroundColor", out tmpBackgroundColor); + manifestApp.GetStringValue("EntryPoint", out tmpEntryPoint); + + UserModelId = tmpUserModelId; + UniqueIdentifier = tmpUniqueIdentifier; + DisplayName = tmpDisplayName; + Description = tmpDescription; + BackgroundColor = tmpBackgroundColor; + EntryPoint = tmpEntryPoint; + Package = package; - EntryPoint = manifestApp.GetStringValue("EntryPoint"); - + DisplayName = ResourceFromPri(package.FullName, DisplayName); Description = ResourceFromPri(package.FullName, Description); LogoUri = LogoUriFromManifest(manifestApp); @@ -482,7 +492,7 @@ namespace Microsoft.Plugin.Program.Programs } - internal string LogoUriFromManifest(IAppxManifestApplication app) + internal string LogoUriFromManifest(AppxPackageHelper.IAppxManifestApplication app) { var logoKeyFromVersion = new Dictionary { @@ -492,8 +502,9 @@ namespace Microsoft.Plugin.Program.Programs }; if (logoKeyFromVersion.ContainsKey(Package.Version)) { + string logoUri; var key = logoKeyFromVersion[Package.Version]; - var logoUri = app.GetStringValue(key); + app.GetStringValue(key, out logoUri); return logoUri; } else