ShellLink возвращает старое местоположение - PullRequest
0 голосов
/ 21 июня 2019

В программе на 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 голосов
/ 22 июня 2019

Я получаю правильный результат с WMI и Win32_ShortcutFile

Тест с указанным ярлыком в Windows 10, VS 2015, часть кода, сгенерированного WMI Code Creator =>

// 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);
}
0 голосов
/ 22 июня 2019

В комментариях Джими дал одну часть ответа, которая была следующей ссылкой на содержимое LNK: https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/

Однако это кажется немного опасным, надеясь, что Microsoft никогда не изменитэто в будущих обновлениях Windows.

Кроме того, я хотел бы услышать объяснение того, почему "официальный" способ сделать это терпит неудачу.Как / почему эти классы .NET сообщают о старом расположении ссылки, а не о местоположении, которое фактически находится в файле ссылок?Другое решение, на которое указывал Джими, провалилось так же, как и мое, используя классы Shell, Folder, FolderItem и ShellLinkObject.

Я бы проголосовал против, если бы он отправил ответ вместо комментария.Вместо этого я просто скажу: «Moreas gracias», «Domo Arigato» и большое спасибо!

...