ShellLink返回旧位置

时间:2019-06-21 16:19:45

标签: c# shell32 lnk

在C#程序中,我希望能够识别LNK文件的文件位置(实际文件位置,而不是LNK位置)。但是有时ShellLink会返回文件的旧位置。例如,它将返回“ C:\ Program Files(x86)\ XXX \ xxx.exe”,而不是“ C:\ Program Files \ XXX \ xxx.exe”(LNK文件中的实际文本)。 我以为旧的位置可能会缓存在注册表中,但找不到该字符串。 关于如何确保ShellLink标识正确位置或修复此特定“错误”链接的任何想法?我已经重新创建了链接并重新启动,但这没有帮助。

/// <summary>Given a LNK file, return the file that it points to.</summary>
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);
    if (sb.Length == 0 && !filename.EndsWith(".LNK", StringComparison.OrdinalIgnoreCase)) sb.Append(filename);
    return sb.ToString();
}

2 个答案:

答案 0 :(得分:0)

Jimi在评论中给出了答案的一部分,该链接深入了LNK的内容:https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/

但是,这似乎有些危险,希望Microsoft在以后的Windows更新中永远不会修改它。

此外,我很想听听为什么这样做的“官方”方式失败的解释。这些.NET类如何/为什么报告链接的旧位置,而不是链接文件中的实际位置? Jimi指出的另一个解决方案使用Shell,Folder,FolderItem和ShellLinkObject类以与我相同的方式失败。

如果Jimi提交了答案而不是发表评论,我将对他进行投票。取而代之的是,我只想说点谢谢,domo arigato,非常感谢!

答案 1 :(得分:0)

我用 WMI Win32_ShortcutFile

得到正确的结果

在Windows 10,VS 2015上具有给定快捷方式的测试,这是由 WMI代码创建器生成的部分代码 =>

// Add reference to System.Management
// using System.Management;
string sLinkPath = "C:\\Users\\Christian\\Desktop";
string sLinkName = "MpCmdRun.lnk";
string sRequest = "SELECT * FROM Win32_ShortcutFile where Name=\"" + sLinkPath + "\\" + sLinkName + "\"";
sRequest = sRequest.Replace("\\", "\\\\");
try
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", sRequest);

    foreach (ManagementObject queryObj in searcher.Get())
    {
        Console.WriteLine("Target: {0}", queryObj["Target"]);
        // Target: C:\Program Files\Windows Defender\MpCmdRun.exe
    }
}
catch (ManagementException me)
{
    System.Windows.Forms.MessageBox.Show("An error occurred while querying for WMI data: " + me.Message);
}