2009-03-11 11 views
5

De vuelta en .NET 1.0 días Escribí un método para devolver el objetivo de un acceso directo en MS Windows. Lo hizo mediante el uso de una interoperabilidad a la secuencia de comandos Alojamiento Windows Object Model y bruta fuerzan a través de la interfaz COM:¿Hay alguna manera de seguir un atajo del sistema de archivos de Windows programáticamente en C# sin usar COM?

private FileInfo GetFileFromShortcut(FileInfo shortcut) 
{ 
    FileInfo targetFile = null; 

    try 
    { 
     IWshRuntimeLibrary.WshShell wShell = new IWshRuntimeLibrary.WshShellClass(); 
     IWshRuntimeLibrary.WshShortcut wShortcut = (IWshRuntimeLibrary.WshShortcut)wShell.CreateShortcut(shortcut.FullName); 

     // if the file wasn't a shortcut then the TargetPath comes back empty 
     string targetName = wShortcut.TargetPath; 
     if (targetName.Length > 0) 
     { 
      targetFile = new FileInfo(targetName); 
     } 
    } 
    catch (Exception) 
    { // will return a null targetFile if anything goes wrong 
    } 

    return targetFile; 
} 

errores Esta siendo yo, y yo estaba buscando para reemplazar esto con algo más elegante, pero sólo si el reemplazo realmente funciona al menos tan bien. Todavía no puedo encontrar una forma nativa de C# de encontrar el objetivo de un atajo. ¿Hay alguno, o sigue siendo la mejor manera de hacer este tipo de cosas?

+0

Gran pregunta. No he pensado en cómo hacerlo funcionar sin interoperabilidad COM – Sung

+0

No pude evitar usar el shell a través del código no administrado para lograr esto desafortunadamente. – RobS

Respuesta

1

Parece que alguien ha escrito una clase para manipular archivos de acceso directo en C# llamado ShellLink, pero también utiliza COM.

+0

Ocultar la actividad COM detrás de otra capa no era realmente lo que quería hacer: quiero publicar este código en un proyecto de código abierto y no me gustó la parte de COM bashing. Pero si no hay otro camino ... –

+1

¿Por qué no quieres usar COM? Usar IShellLink es la forma correcta de hacer las cosas, ya que es la API que proporciona Windows para el análisis/modificación de acceso directo. Su código original que utilizaba Windows Scripting Host no era la mejor manera de hacer las cosas, pero eso se debía a que usaba un objeto contenedor diseñado para lenguajes de scripting, no porque usaba un objeto COM. COM se usa detrás de escena todo el tiempo en Windows; es inevitable. –

1

¿No puede simplemente abrir el archivo .lnk o .url y analizarlo?

Esto habla de lo mismo y muestra lo que los archivos se ven como: http://www.programmingtalk.com/showthread.php?t=7335

+1

No estoy seguro de que el análisis de un archivo que no tiene una definición publicada sea algo en lo que deseo confiar en mi código de producción. Hay una solución segura que está atacando la interfaz COM al menos sé que siempre funcionará. –

0

me interesé en esto también hace un tiempo.

Aquí está el response aceptado con un enlace a un (informal) description of the format de archivos LNK. Aparentemente, todos los métodos disponibles aún pasan por API.

Cuestiones relacionadas