diff --git a/Plugins/Wox.Plugin.Program/Programs.cs b/Plugins/Wox.Plugin.Program/Programs.cs index 347f640b8a..90604cf702 100644 --- a/Plugins/Wox.Plugin.Program/Programs.cs +++ b/Plugins/Wox.Plugin.Program/Programs.cs @@ -5,7 +5,6 @@ using System.IO; using System.Linq; using System.Reflection; using System.Windows; -using IWshRuntimeLibrary; using Wox.Infrastructure; using Wox.Plugin.Program.ProgramSources; using Wox.Infrastructure.Logger; @@ -50,14 +49,6 @@ namespace Wox.Plugin.Program return results; } - static string ResolveShortcut(string filePath) - { - // IWshRuntimeLibrary is in the COM library "Windows Script Host Object Model" - WshShell shell = new WshShell(); - IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(filePath); - return shortcut.TargetPath; - } - private bool MatchProgram(Program program, FuzzyMatcher matcher) { var scores = new List { program.Title, program.PinyinTitle, program.AbbrTitle, program.ExecuteName }; @@ -224,7 +215,9 @@ namespace Wox.Plugin.Program if (Path.EndsWith(".lnk")) { //get location of shortcut - Path = ResolveShortcut(Path); + var resolved = ShortcutHelper.ResolveShortcut(Path); + if(!string.IsNullOrEmpty(resolved)) + Path = resolved; } //get parent folder Path = Directory.GetParent(Path).FullName; diff --git a/Plugins/Wox.Plugin.Program/ShortcutHelper.cs b/Plugins/Wox.Plugin.Program/ShortcutHelper.cs new file mode 100644 index 0000000000..def9640ede --- /dev/null +++ b/Plugins/Wox.Plugin.Program/ShortcutHelper.cs @@ -0,0 +1,74 @@ +/* + Shortcut resolver. Avoids using IWshRuntimeLibrary + Proposed by Sam Saffron @ StackOverflow +*/ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Wox.Plugin.Program +{ + public class ShortcutHelper + { + #region Signatures + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + struct WIN32_FIND_DATAW + { + public uint dwFileAttributes; + public long ftCreationTime; + public long ftLastAccessTime; + public long ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + public uint dwReserved0; + public uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + public string cAlternateFileName; + } + + /// The IShellLink interface allows Shell links to be created, modified, and resolved + [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")] + interface IShellLinkW + { + /// Retrieves the path and file name of a Shell link object + void GetPath([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out WIN32_FIND_DATAW pfd, uint fFlags); + } + + [ComImport, Guid("0000010c-0000-0000-c000-000000000046"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IPersist { } + + [ComImport, Guid("0000010b-0000-0000-C000-000000000046"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IPersistFile : IPersist + { + new void GetClassID(out Guid pClassID); + [PreserveSig] + void Load([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, uint dwMode); + } + + const uint STGM_READ = 0; + const int MAX_PATH = 260; + + // CLSID_ShellLink from ShlGuid.h + [ + ComImport(), + Guid("00021401-0000-0000-C000-000000000046") + ] + public class ShellLink + { + } + #endregion + public static string ResolveShortcut(string filename) + { + ShellLink link = new ShellLink(); + ((IPersistFile)link).Load(filename, STGM_READ); + StringBuilder sb = new StringBuilder(MAX_PATH); + WIN32_FIND_DATAW data = new WIN32_FIND_DATAW(); + ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0); + return sb.ToString(); + } + } +} diff --git a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj index 784a900d92..5eac4a7511 100644 --- a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj +++ b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj @@ -71,6 +71,7 @@ ProgramSuffixes.xaml + @@ -126,17 +127,6 @@ Wox.Plugin - - - {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} - 1 - 0 - 0 - tlbimp - False - True - -