Domanda

C'è un modo per aprire un collegamento di Windows (file .lnk) e cambiare il bersaglio? Ho trovato il seguente frammento che mi permette di trovare il bersaglio corrente, ma è una proprietà di sola lettura:

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;

Non riesco a trovare nulla per alterare il bersaglio. È la mia unica opzione per creare un nuovo collegamento per sovrascrivere quello attuale? ..e se sì, come posso fare?

È stato utile?

Soluzione

Non è di sola lettura, l'uso lnk-> Percorso invece, seguito da lnk-> Salva (). Supponendo di avere privilegi di scrittura al file. Codice C # che fa la stessa cosa è nella mia risposta in questa discussione .

Altri suggerimenti

Ricreare un collegamento con WSH

È possibile rimuovere un collegamento esistente e crearne uno nuovo con il nuovo obiettivo. Per creare una nuova, è possibile utilizzare il seguente frammento:

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

Per il momento, non vedo alcun modo per cambiare la destinazione senza ricreare il collegamento.

. Nota: per utilizzare il frammento di, è necessario aggiungere Windows Script Host Object Model COM ai riferimenti del progetto

La modifica del percorso di destinazione con Shell32

Ecco il frammento di che cambia la destinazione di un collegamento senza rimuovere e ricreare esso:

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();
}

Il secondo è probabilmente quello che vi serve.

Nota: mi dispiace, i frammenti sono in C # in quanto non so C ++ / CLI. Se qualcuno vuole riscrivere quei frammenti di C ++ / CLI, sentitevi liberi di modificare la mia risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top