Obtener la ruta real de un acceso directo

Iniciado por Spider-Net, 19 Mayo 2009, 23:16 PM

0 Miembros y 1 Visitante están viendo este tema.

Spider-Net

Hola a tod@s. Estoy programando un panel completo para mi NetBook. Ya sabemos que estos cacharritos son muy útiles (al menos para mí). Pero la resolución de 1024x600 deja poquito espacio en el escritorio para colocar iconos y demás así que estoy programando un panel ocultable y personalizable donde poder poner tus propios iconos y demás. Cuando lo termine lo postearé por aquí.

El caso es que he programado un drag&drop sencillo para que cuando arrastres un fichero o directorio desde el explorador de windows al panel automáticamente crea un icono que posee el icono de ese programa y el enlace al mismo (digamos que es un acceso directo desde el programa ejecutado con ShellExecute).

Hasta ahí todo bien, pero me gustaría que si arrastro al panel un acceso directo de Windows en lugar de tomar la ruta de ese acceso directo y su icono, me gustaría tomar el archivo original de modo que si yo tengo en mi escritorio un acceso directo a Dreamweaver en lugar de tomar el icono y enlace de:
C:\Documents And Settings\Usuario\Escritorio\Dreamweaver.Ink
Que obtenga al ruta real de ese acceso y tome el icono y enlace a:
C:\Archivos de Programa\Adobe\DreamWeaver CS3\Dreamweaver.exe

Simplemente quiero saber como obtener la ruta real de un acceso directo, no sé si habrá algún módulo o alguna API que lo haga. He buscado en el foro y en google y la verdad es que no he encontrado nada, sé que el propio CommonDialog si abres un acceso directo con él, automáticamente haya la ruta real del fichero, así que me gustaría poder hacer algo así.

Perdón por enrollarme tanto pero me gusta explicar bien las cosas xDD
Gracias por leer y gracias por ayudarme de antemano.

Un saludo

Karcrack

Esta es una función de este proyecto que codeé para el Abril Negro ;):
Citar[ABRIL NEGRO][MALWARE]Karcrack Ransom

Código (vb) [Seleccionar]
'---------------------------------------------------------------------------------------
' Procedimiento : GetLnkTarget
' Autor         : Karcrack
' Fecha         : 28/04/2009
' Parametro(s)  : sPath -> Ruta del fichero *.lnk
' Return        : La ruta a la que apunta el fichero *.lnk
'---------------------------------------------------------------------------------------

Private Function GetLnkTarget(ByVal sPath As String) As String
    Dim WSH         As Object
    Dim oShellLnk   As Object
 
    Set WSH = CreateObject("WScript.Shell")
    Set oShellLnk = WSH.CreateShortcut(sPath)

    GetLnkTarget = oShellLnk.TargetPath
   
    Set WSH = Nothing
    Set oShellLnk = Nothing
End Function


Saludos ;)

Novlucker

#2
Bueno, ahora se me ocurren dos maneras, wmi y objshell, pero dejo esta última que son solo un par de líneas  :P

Código (vb) [Seleccionar]
Set Objshell = Createobject("WScript.shell")
Set objLink = Objshell.CreateShortCut(RutaLink)
Msgbox objLink.targetpath
Msgbox objLink.arguments


Con targetpath obtienes la ruta a la que apunta el acceso directo, y con arguments los parámetros que lleva, como ser parámetros que se pasan en el mismo link al ejecutable en cuestión  :P

Por poner un ejemplo, en datos de destino del acceso directo a Nero Express se muestra esto:
"C:\Archivos de programa\Nero\Nero 9\Nero Express\NeroExpress.exe" -ScParameter=30001  /w
Targetpath ... C:\Archivos de programa\Nero\Nero 9\Nero Express\NeroExpress.exe
Arguments ... -ScParameter=30001  /w

Saludos  ;D



P.D: había dejado este post abierto y veo que Karcrack a publicado practicamente lo mismo, pero bueno, a el le faltan los parametros y no me va eso de estar poniendo nombre/autor a funciones tan sencillas  :rolleyes:
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Karcrack

Bueno, esta funcion la he sacado tal cual del "Karcrack Ransom"... No pienses que he puesto los creditos para que no me copien la funcion >:( :¬¬

Bueno, lo de los parametros lo he puesto porque en el K.R no hace falta para cumplir el cometido ;)

Saludos ;D

Novlucker

#4
Ya se, lo decía sin animos de ofender a nadie  ;D
Lo que ocurre es que desde hace algún tiempo veo que son muchos los usuarios (de diversos foros) que crean funciones y les ponen los créditos para que luego se los cite, pero en realidad dichas funciones son fundamentalmente 3 líneas , como sigamos así dentro de un tiempo no se va a poder utilizar tranquilo un Msgbox con 3 tabuladores delante porque alguien más lo va a tener en su función  :xD

CitarBueno, lo de los parametros lo he puesto porque en el K.R no hace falta para cumplir el cometido ;)
True, en el tuyo no hace falta ya que listas los archivos recientes  :P , pero de cualquier manera arguments es algo que se olvida siempre al trabajar con accesos directos, se asume destino == targetpath, por eso la aclaración  :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Spider-Net

Muchísimas gracias a ambos por las respuestas. Me habéis ayudado con mi problema y de paso está muy bien eso de sacar los argumentos porque tienes razón en que el acceso directo no siempre es el targetpath sino que a veces también tienen argumentos así que es bueno tenerlo en cuenta.

Pues eso muchas gracias a los dos y cuando termine el programita lo publicaré por aquí para que opinéis ;)

Un saludo.