diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/IAppInfoPanel.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/IAppInfoPanel.cs new file mode 100644 index 0000000..3b2f374 --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/IAppInfoPanel.cs @@ -0,0 +1,27 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +namespace QuickLook.Plugin.AppViewer; + +public interface IAppInfoPanel +{ + public void DisplayInfo(string path); + + public object Tag { get; set; } + + public bool Stop { get; set; } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiImageParser/MsiInfo.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiImageParser/MsiInfo.cs new file mode 100644 index 0000000..7cf13f4 --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiImageParser/MsiInfo.cs @@ -0,0 +1,31 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +namespace QuickLook.Plugin.AppViewer.MsiImageParser; + +public sealed class MsiInfo +{ + public string ProductVersion { get; set; } + + public string ProductName { get; set; } + + public string Manufacturer { get; set; } + + public string ProductCode { get; set; } + + public string UpgradeCode { get; set; } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiImageParser/MsiParser.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiImageParser/MsiParser.cs new file mode 100644 index 0000000..991481b --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiImageParser/MsiParser.cs @@ -0,0 +1,45 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using WixToolset.Dtf.WindowsInstaller; + +namespace QuickLook.Plugin.AppViewer.MsiImageParser; + +public static class MsiParser +{ + public static MsiInfo Parse(string path) + { + MsiInfo info = new(); + using var database = new Database(path, DatabaseOpenMode.ReadOnly); + + info.ProductVersion = database.ReadPropertyString(nameof(MsiInfo.ProductVersion)); + info.ProductName = database.ReadPropertyString(nameof(MsiInfo.ProductName)); + info.Manufacturer = database.ReadPropertyString(nameof(MsiInfo.Manufacturer)); + info.ProductCode = database.ReadPropertyString(nameof(MsiInfo.ProductCode)); + info.UpgradeCode = database.ReadPropertyString(nameof(MsiInfo.UpgradeCode)); + + return info; + } + + private static string ReadPropertyString(this Database database, string propertyName) + { + using View view = database.OpenView($"SELECT `Value` FROM `Property` WHERE `Property`='{propertyName}'"); + view.Execute(null); + using Record record = view.Fetch(); + return record?.GetString(1); + } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiInfoPanel.xaml b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiInfoPanel.xaml new file mode 100644 index 0000000..c046ec3 --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiInfoPanel.xaml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiInfoPanel.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiInfoPanel.xaml.cs new file mode 100644 index 0000000..dd8ebfa --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/MsiInfoPanel.xaml.cs @@ -0,0 +1,97 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using QuickLook.Common.ExtensionMethods; +using QuickLook.Common.Helpers; +using QuickLook.Plugin.AppViewer.MsiImageParser; +using System; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Threading.Tasks; +using System.Windows.Controls; + +namespace QuickLook.Plugin.AppViewer; + +public partial class MsiInfoPanel : UserControl, IAppInfoPanel +{ + private bool _stop; + + public MsiInfoPanel() + { + InitializeComponent(); + + // apply global theme + Resources.MergedDictionaries[0].Clear(); + + string translationFile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Translations.config"); + productNameTitle.Text = TranslationHelper.Get("PRODUCT_NAME", translationFile); + productVersionTitle.Text = TranslationHelper.Get("PRODUCT_VERSION", translationFile); + manufacturerTitle.Text = TranslationHelper.Get("MANUFACTURER", translationFile); + totalSizeTitle.Text = TranslationHelper.Get("TOTAL_SIZE", translationFile); + modDateTitle.Text = TranslationHelper.Get("LAST_MODIFIED", translationFile); + } + + public bool Stop + { + set => _stop = value; + get => _stop; + } + + public void DisplayInfo(string path) + { + _ = Task.Run(() => + { + var scale = DisplayDeviceHelper.GetCurrentScaleFactor(); + + var icon = + WindowsThumbnailProvider.GetThumbnail(path, + (int)(128 * scale.Horizontal), + (int)(128 * scale.Vertical), + ThumbnailOptions.ScaleUp); + + var source = icon?.ToBitmapSource(); + icon?.Dispose(); + + Dispatcher.BeginInvoke(new Action(() => image.Source = source)); + }); + + var name = Path.GetFileName(path); + filename.Text = string.IsNullOrEmpty(name) ? path : name; + + Stop = false; + + _ = Task.Run(() => + { + if (File.Exists(path)) + { + var size = new FileInfo(path).Length; + MsiInfo msiInfo = MsiParser.Parse(path); + var last = File.GetLastWriteTime(path); + + Dispatcher.Invoke(() => + { + productName.Text = msiInfo.ProductName; + productVersion.Text = msiInfo.ProductVersion; + manufacturer.Text = msiInfo.Manufacturer; + totalSize.Text = size.ToPrettySize(2); + modDate.Text = last.ToString(CultureInfo.CurrentCulture); + }); + } + }); + } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Plugin.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Plugin.cs new file mode 100644 index 0000000..11b3636 --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Plugin.cs @@ -0,0 +1,99 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using QuickLook.Common.Plugin; +using System; +using System.IO; +using System.Linq; +using System.Windows; + +namespace QuickLook.Plugin.AppViewer; + +public class Plugin : IViewer +{ + private static readonly string[] _extensions = + [ + // Android + //".apk", ".apk.1", // Android Package + //".aar", // Android Archive + //".aab", // Android App Bundle + + // Windows + //".appx", ".appxbundle", // Windows APPX installer + ".msi", // Windows MSI installer + //".msix", ".msixbundle", // Windows MSIX installer + + // macOS + //".dmg", // macOS DMG + + // iOS + //".ipa", // iOS IPA + + // HarmonyOS + //".hap", // HarmonyOS Package + //".har", // HarmonyOS Archive + + // Others + //".wgt", ".wgtu", // UniApp Widget + ]; + + private IAppInfoPanel _ip; + private string _path; + + public int Priority => 0; + + public void Init() + { + } + + public bool CanHandle(string path) + { + return !Directory.Exists(path) && _extensions.Any(path.ToLower().EndsWith); + } + + public void Prepare(string path, ContextObject context) + { + context.PreferredSize = Path.GetExtension(path) switch + { + ".msi" => new Size { Width = 520, Height = 230 }, + _ => throw new NotSupportedException("Extension is not supported."), + }; + } + + public void View(string path, ContextObject context) + { + _path = path; + _ip = Path.GetExtension(path) switch + { + ".msi" => new MsiInfoPanel(), + _ => throw new NotSupportedException("Extension is not supported."), + }; + + _ip.DisplayInfo(_path); + _ip.Tag = context; + + context.ViewerContent = _ip; + context.IsBusy = false; + } + + public void Cleanup() + { + GC.SuppressFinalize(this); + + _ip = null; + } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Properties/AssemblyInfo.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c8315f9 --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Properties/AssemblyInfo.cs @@ -0,0 +1,50 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("QuickLook.Plugin.AppViewer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("pooi.moe")] +[assembly: AssemblyProduct("QuickLook.Plugin.AppViewer")] +[assembly: AssemblyCopyright("Copyright © 2017-2025 QL-Win Contributors")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("00d8f3b1-5be9-4ab8-ae68-16374001887a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/QuickLook.Plugin.AppViewer.csproj b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/QuickLook.Plugin.AppViewer.csproj new file mode 100644 index 0000000..e1ebf3e --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/QuickLook.Plugin.AppViewer.csproj @@ -0,0 +1,79 @@ + + + + Library + net462 + QuickLook.Plugin.AppViewer + QuickLook.Plugin.AppViewer + 512 + false + true + latest + false + false + false + MinimumRecommendedRules.ruleset + {00D8F3B1-5BE9-4AB8-AE68-16374001887A} + + + + true + full + false + ..\..\Build\Debug\QuickLook.Plugin\QuickLook.Plugin.AppViewer\ + DEBUG;TRACE + prompt + + + + pdbonly + true + ..\..\Build\Release\QuickLook.Plugin\QuickLook.Plugin.AppViewer\ + TRACE + prompt + + + + true + full + ..\..\Build\Debug\QuickLook.Plugin\QuickLook.Plugin.AppViewer\ + DEBUG;TRACE + x86 + prompt + + + + ..\..\Build\Release\QuickLook.Plugin\QuickLook.Plugin.AppViewer\ + TRACE + true + pdbonly + x86 + prompt + + + + + {85FDD6BA-871D-46C8-BD64-F6BB0CB5EA95} + QuickLook.Common + False + + + + + + Properties\GitVersion.cs + + + + + + + + + + + PreserveNewest + + + + diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Translations.config b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Translations.config new file mode 100644 index 0000000..afb57ce --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/Translations.config @@ -0,0 +1,39 @@ + + + + + Product Version + Product Name + Manufacturer + Total Size + Last Modified + + + Versão do produto + Nome do produto + Fabricante + Tamanho total + Modificado em + + + 产品版本 + 产品名称 + 制造商 + 总大小 + 修改时间 + + + 產品版本 + 產品名稱 + 製造商 + 縂大小 + 修改時間 + + + 製品バージョン + 製品名 + 製造元 + 合計サイズ + 更新日時 + + diff --git a/QuickLook.Plugin/QuickLook.Plugin.AppViewer/WindowsThumbnailProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/WindowsThumbnailProvider.cs new file mode 100644 index 0000000..449524f --- /dev/null +++ b/QuickLook.Plugin/QuickLook.Plugin.AppViewer/WindowsThumbnailProvider.cs @@ -0,0 +1,225 @@ +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; + +namespace QuickLook.Plugin.AppViewer; + +[Flags] +internal enum ThumbnailOptions +{ + None = 0x00, + BiggerSizeOk = 0x01, + InMemoryOnly = 0x02, + IconOnly = 0x04, + ThumbnailOnly = 0x08, + InCacheOnly = 0x10, + IconBackground = 0x80, + ScaleUp = 0x100 +} + +internal static class WindowsThumbnailProvider +{ + private const string IShellItem2Guid = "7E9FB0D3-919F-4307-AB2E-9B1860310C93"; + + [DllImport("shell32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern int SHCreateItemFromParsingName( + [MarshalAs(UnmanagedType.LPWStr)] string path, + // The following parameter is not used - binding context. + IntPtr pbc, + ref Guid riid, + [MarshalAs(UnmanagedType.Interface)] out IShellItem shellItem); + + [DllImport("gdi32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteObject(IntPtr hObject); + + public static Bitmap GetThumbnail(string fileName, int width, int height, ThumbnailOptions options) + { + var hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options); + + if (hBitmap == IntPtr.Zero) + return null!; + + try + { + // return a System.Drawing.Bitmap from the hBitmap + return GetBitmapFromHBitmap(hBitmap); + } + finally + { + // delete HBitmap to avoid memory leaks + DeleteObject(hBitmap); + } + } + + internal static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap) + { + var bmp = Image.FromHbitmap(nativeHBitmap); + + if (Image.GetPixelFormatSize(bmp.PixelFormat) < 32) + return bmp; + + return CreateAlphaBitmap(bmp, PixelFormat.Format32bppArgb); + } + + internal static Bitmap CreateAlphaBitmap(Bitmap srcBitmap, PixelFormat targetPixelFormat) + { + var result = new Bitmap(srcBitmap.Width, srcBitmap.Height, targetPixelFormat); + + var bmpBounds = new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height); + + var srcData = srcBitmap.LockBits(bmpBounds, ImageLockMode.ReadOnly, srcBitmap.PixelFormat); + + var isAlplaBitmap = false; + + try + { + for (var y = 0; y <= srcData.Height - 1; y++) + for (var x = 0; x <= srcData.Width - 1; x++) + { + var pixelColor = Color.FromArgb( + Marshal.ReadInt32(srcData.Scan0, srcData.Stride * y + 4 * x)); + + if ((pixelColor.A > 0) & (pixelColor.A < 255)) + isAlplaBitmap = true; + + result.SetPixel(x, y, pixelColor); + } + } + finally + { + srcBitmap.UnlockBits(srcData); + } + + if (isAlplaBitmap) + return result; + return srcBitmap; + } + + private static IntPtr GetHBitmap(string fileName, int width, int height, ThumbnailOptions options) + { + var shellItem2Guid = new Guid(IShellItem2Guid); + var retCode = + SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out var nativeShellItem); + + if (retCode != 0) + return IntPtr.Zero; + + var nativeSize = new NativeSize + { + Width = width, + Height = height + }; + + var hr = ((IShellItemImageFactory)nativeShellItem).GetImage(nativeSize, options, out var hBitmap); + + Marshal.ReleaseComObject(nativeShellItem); + + return hr == HResult.Ok ? hBitmap : IntPtr.Zero; + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")] + internal interface IShellItem + { + void BindToHandler(IntPtr pbc, + [MarshalAs(UnmanagedType.LPStruct)] Guid bhid, + [MarshalAs(UnmanagedType.LPStruct)] Guid riid, + out IntPtr ppv); + + void GetParent(out IShellItem ppsi); + + void GetDisplayName(SIGDN sigdnName, out IntPtr ppszName); + + void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs); + + void Compare(IShellItem psi, uint hint, out int piOrder); + } + + internal enum SIGDN : uint + { + NORMALDISPLAY = 0, + PARENTRELATIVEPARSING = 0x80018001, + PARENTRELATIVEFORADDRESSBAR = 0x8001c001, + DESKTOPABSOLUTEPARSING = 0x80028000, + PARENTRELATIVEEDITING = 0x80031001, + DESKTOPABSOLUTEEDITING = 0x8004c000, + FILESYSPATH = 0x80058000, + URL = 0x80068000 + } + + internal enum HResult + { + Ok = 0x0000, + False = 0x0001, + InvalidArguments = unchecked((int)0x80070057), + OutOfMemory = unchecked((int)0x8007000E), + NoInterface = unchecked((int)0x80004002), + Fail = unchecked((int)0x80004005), + ElementNotFound = unchecked((int)0x80070490), + TypeElementNotFound = unchecked((int)0x8002802B), + NoObject = unchecked((int)0x800401E5), + Win32ErrorCanceled = 1223, + Canceled = unchecked((int)0x800704C7), + ResourceInUse = unchecked((int)0x800700AA), + AccessDenied = unchecked((int)0x80030005) + } + + [ComImport] + [Guid("bcc18b79-ba16-442f-80c4-8a59c30c463b")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IShellItemImageFactory + { + [PreserveSig] + HResult GetImage( + [In][MarshalAs(UnmanagedType.Struct)] NativeSize size, + [In] ThumbnailOptions flags, + [Out] out IntPtr phbm); + } + + [StructLayout(LayoutKind.Sequential)] + internal struct NativeSize + { + private int width; + private int height; + + public int Width + { + set => width = value; + } + + public int Height + { + set => height = value; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct RGBQUAD + { + public byte rgbBlue; + public byte rgbGreen; + public byte rgbRed; + public byte rgbReserved; + } +} diff --git a/QuickLook.Plugin/QuickLook.Plugin.PEViewer/PEInfoPanel.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.PEViewer/PEInfoPanel.xaml.cs index 1853e70..87cfa9b 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.PEViewer/PEInfoPanel.xaml.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.PEViewer/PEInfoPanel.xaml.cs @@ -52,7 +52,7 @@ public partial class PEInfoPanel : UserControl public void DisplayInfo(string path) { - Task.Run(() => + _ = Task.Run(() => { var scale = DisplayDeviceHelper.GetCurrentScaleFactor(); diff --git a/QuickLook.sln b/QuickLook.sln index 532c04e..c959153 100644 --- a/QuickLook.sln +++ b/QuickLook.sln @@ -52,6 +52,7 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "QuickLook.Installer", "Quic {8D50A1DA-601C-4C26-9A7E-7D477EA8430A} = {8D50A1DA-601C-4C26-9A7E-7D477EA8430A} {CE40160D-5E3C-4A41-9BDA-C4F414C174EB} = {CE40160D-5E3C-4A41-9BDA-C4F414C174EB} {538FD6BA-2AF1-4DDA-93A2-6C0A12B00843} = {538FD6BA-2AF1-4DDA-93A2-6C0A12B00843} + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30} = {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QuickLook.Native64", "QuickLook.Native\QuickLook.Native64\QuickLook.Native64.vcxproj", "{794E4DCF-F715-4836-9D30-ABD296586D23}" @@ -80,6 +81,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickLook.Plugin.FontViewer EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickLook.Plugin.CLSIDViewer", "QuickLook.Plugin\QuickLook.Plugin.CLSIDViewer\QuickLook.Plugin.CLSIDViewer.csproj", "{538FD6BA-2AF1-4DDA-93A2-6C0A12B00843}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickLook.Plugin.AppViewer", "QuickLook.Plugin\QuickLook.Plugin.AppViewer\QuickLook.Plugin.AppViewer.csproj", "{EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -234,6 +237,14 @@ Global {538FD6BA-2AF1-4DDA-93A2-6C0A12B00843}.Release|Any CPU.Build.0 = Release|Any CPU {538FD6BA-2AF1-4DDA-93A2-6C0A12B00843}.Release|x86.ActiveCfg = Release|Any CPU {538FD6BA-2AF1-4DDA-93A2-6C0A12B00843}.Release|x86.Build.0 = Release|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Debug|x86.ActiveCfg = Debug|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Debug|x86.Build.0 = Debug|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Release|Any CPU.Build.0 = Release|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Release|x86.ActiveCfg = Release|Any CPU + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -255,6 +266,7 @@ Global {8D50A1DA-601C-4C26-9A7E-7D477EA8430A} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93} {CE40160D-5E3C-4A41-9BDA-C4F414C174EB} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93} {538FD6BA-2AF1-4DDA-93A2-6C0A12B00843} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93} + {EB7D1F10-6E04-4F7E-96A0-4E18359FBD30} = {06EFDBE0-6408-4B37-BCF2-0CF9EBEA2E93} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D3761C32-8C5F-498A-892B-3B0882994B62}