2017-12-01 4 views
0

Ich versuche, das Symbol einer Verknüpfung auf einen Ordner zeigen, aber keine Ressourcen zum Festlegen eines Verknüpfungssymbols auf ein systemeigenes Symbol von shell32.dll finden. Ich habe This Antwort auf msdn von Rykler gefunden, aber die Antwort ist veraltet. Jede Hilfe wäre willkommen.Verwenden Sie das Symbol von shell32.dll als Verknüpfungssymbol

-Code

SHFILEINFO shinfo = new SHFILEINFO(); 
Win32.SHGetFileInfo(filename, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), (int)0x1000); 
// icon index # and path 
int IconIndex = shinfo.iIcon 
string IconPath = shinfo.szDisplayName 
shortcut.IconLocation = ??? 

SHFILEINFO struct: (Entnommen aus This Frage)

[StructLayout(LayoutKind.Sequential)] 
public struct SHFILEINFO 
{ 
    public IntPtr hIcon; 
    public int iIcon; 
    public uint dwAttributes; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public string szDisplayName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string szTypeName; 
}; 

class Win32 
{ 
    [DllImport("shell32.dll")] 
    public static extern IntPtr SHGetFileInfo(string pszPath, uint 
dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); 
} 
+0

„aber Visual Studio wirft ein Fehler“ Jedes Mal, wenn Sie eine Fehlermeldung haben, ist es eine gute Idee, es als Teil Ihrer Frage zu teilen. – itsme86

+0

Keine Überladung für die Methode 'ExpandEnvironmentStrings' benötigt 2 Argumente. Ich denke, dass die Antwort, die ich mir angesehen habe, überholt ist. –

+0

'ExpandEnvironmentStrings' wird nicht in Ihrem Code angezeigt. Wie kann das im Fehler enthalten sein? – NetMage

Antwort

0

So, nach einer wenig Forschung, ist es nicht kompliziert zu sein scheint. Nehmen Sie zunächst die Schnittstellendeklarationen von this question. Nehmen Sie die Deklarationen in Ihr Projekt auf.

Danach können Sie diesen Code verwenden:

public class Q47602417 
{ 
    public static void MakeShortcut(string targetPath) 
    { 
     var shellLink = new ShellLink(); 
     ((IShellLinkW)shellLink).SetDescription("Sample Shortcut"); 
     ((IShellLinkW)shellLink).SetPath(targetPath); 
     ((IShellLinkW)shellLink).SetIconLocation(Environment.SystemDirectory + "\\Shell32.dll", 12); 
     ((IPersistFile)shellLink).Save(@"C:\temp\shortcut.lnk", false); 
    } 
} 

Eine Sache hinzuzufügen: Diese Probe enthält keine Fehlerprüfung! Sie wissen nicht, ob die Verknüpfung erstellt wurde oder nicht. So ändern Sie die Interface-Methoden genannt ganzen Zahlen zurückzukehren und Ausnahmenüberprüfung hinzufügen:

//... 

int SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); 
int SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); 
int SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); 

//.. omitted other details ... 

int Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, [In, MarshalAs(UnmanagedType.Bool)] bool fRemember); 

Jetzt können Sie überprüfen, ob die Verknüpfung acutally Erstellung funktioniert.

public class Q47602417 
{ 

    public static void MakeShortcut(string targetPath) 
    { 
     ShellLink shellLink = new ShellLink(); 
     int hr; 
     hr = ((IShellLinkW)shellLink).SetDescription("Sample Shortcut"); 
     Marshal.ThrowExceptionForHR(hr); 

     hr = ((IShellLinkW)shellLink).SetPath(targetPath); 
     Marshal.ThrowExceptionForHR(hr); 

     hr = ((IShellLinkW)shellLink).SetIconLocation(Environment.SystemDirectory + "\\Shell32.dll", 12); 
     Marshal.ThrowExceptionForHR(hr); 

     hr = ((IPersistFile)shellLink).Save(@"C:\temp\shortcut.lnk", false); 
     Marshal.ThrowExceptionForHR(hr); 
    } 

} 

Beispiel Ergebnis:

enter image description here

+0

Sieht ziemlich schrecklich aus, betrachte den Post, den ich verlinkt habe. Keine explizite Fehlerüberprüfung erforderlich. Jeder COM-Fehlercode wird automatisch in eine CLR-Ausnahme umgewandelt. –

+0

Ich weiß, es sieht schrecklich aus, aber ich habe den obigen Code ohne Fehlerprüfung und einen schreibgeschützten Ordner ausprobiert, und es gab keine CLR-Ausnahme beim Aufruf von 'Speichern'. Ich habe von den Automatisierungsobjekten gelesen, aber umgekehrt habe ich einfach über direkte Anrufe umgekehrt. Da ich mit diesem Thema nicht genug praktische Erfahrung habe, kann ich nicht beurteilen, welche Methode besser oder zukunftssicherer ist. Aber ich stimme zu, dass diese Art der Fehlerprüfung schrecklich ist. – ventiseis

+0

Eine andere Sache ist, dass die ursprüngliche Frage ein wenig unklar ist: Warum benutzt er 'SHGetFileInfo'. In [diese Frage] (https://stackoverflow.com/questions/1599235/how-do-i-fetch-the-folder-icon-on-windows-7-using-shell32-shgetfileinfo) deren Abrufen des Ordnersymbols von ein Griff. Also, wenn der Fragesteller das Icon eines bestimmten Ordners haben will, muss er diesen Code-Teil verwenden, ihn in einem '.ico' speichern und diesen als Symbol für die Verknüpfung verwenden? Oder fehlt mir etwas? – ventiseis

Verwandte Themen