Как мне программно изменить .lnk, чтобы изменить его цель? - PullRequest
6 голосов
/ 29 сентября 2010

Есть ли способ открыть ярлык Windows (файл .lnk) и изменить его цель?Я нашел следующий фрагмент, который позволяет мне найти текущую цель, но это свойство только для чтения:

Shell32::Shell^ shl = gcnew Shell32::Shell();
String^ shortcutPos = "C:\\some\\path\\to\\my\\link.lnk";
String^ lnkPath = System::IO::Path::GetFullPath(shortcutPos);
Shell32::Folder^ dir = shl->NameSpace(System::IO::Path::GetDirectoryName(lnkPath));
Shell32::FolderItem^ itm = dir->Items()->Item(System::IO::Path::GetFileName(lnkPath));
Shell32::ShellLinkObject^ lnk = (Shell32::ShellLinkObject^)itm->GetLink;
String^ target = lnk->Target->Path;

Я не могу найти ничего, чтобы изменить цель.Является ли мой единственный вариант создания нового ярлыка для перезаписи текущего?... и если да, то как мне это сделать?

Ответы [ 2 ]

13 голосов
/ 29 сентября 2010

Это не только для чтения, используйте вместо этого lnk-> Path, затем lnk-> Save ().Предполагая, что у вас есть права на запись в файл.Код C #, который делает то же самое, есть в моем ответе в этой теме .

13 голосов
/ 29 сентября 2010

Воссоздание ярлыка с помощью WSH

Вы можете удалить существующий ярлык и создать новый с новой целью. Чтобы создать новый, вы можете использовать следующий фрагмент:

public void CreateLink(string shortcutFullPath, string target)
{
    WshShell wshShell = new WshShell();
    IWshRuntimeLibrary.IWshShortcut newShortcut = (IWshRuntimeLibrary.IWshShortcut)wshShell.CreateShortcut(shortcutFullPath);
    newShortcut.TargetPath = target;
    newShortcut.Save();
}

На данный момент я не вижу способа изменить цель без воссоздания ярлыка.

Примечание. Чтобы использовать фрагмент, необходимо добавить объектную модель хоста сценариев Windows COM к ссылкам проекта.

Изменение целевого пути с помощью Shell32

Вот фрагмент, который изменяет цель ярлыка, не удаляя и не воссоздавая его:

public void ChangeLinkTarget(string shortcutFullPath, string newTarget)
{
    // Load the shortcut.
    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder folder = shell.NameSpace(Path.GetDirectoryName(shortcutFullPath));
    Shell32.FolderItem folderItem = folder.Items().Item(Path.GetFileName(shortcutFullPath));
    Shell32.ShellLinkObject currentLink = (Shell32.ShellLinkObject)folderItem.GetLink;

    // Assign the new path here. This value is not read-only.
    currentLink.Path = newTarget;

    // Save the link to commit the changes.
    currentLink.Save();
}

Второй, вероятно, то, что вам нужно.

Примечание: извините, фрагменты в C #, так как я не знаю C ++ / CLI. Если кто-то захочет переписать эти фрагменты для C ++ / CLI, смело редактируйте мой ответ.

...