Dos formas de crear accesos directos

Usando DDE y el WSH

Publicado: 22/Ene/2000
Actualizado: 21/Jun/2000


Seguramente, (de hecho), hay m�s formas de hacerlo, pero estas dos que muestro aqu� son las m�s accesibles, es decir, que no necesitas de llamadas al API ni crear referencias a funciones propias del Sistema Operativo para crear links o accesos directos, aunque es lamentable que el Visual Basic no disponga de una funci�n u objeto con el cual poder crear, modificar o simplemente acceder a los accesos directos tan comunes en el Windows... talvez en la versi�n 7... 

La primera forma que mostrar� ser� la que se usaba cuando el Windows 3.x (s�, ese del que ya casi nadie sabe que existi�, aunque a�n hay gente que trabajan con �l), para ello se usaba DDE o lo que es lo mismo la forma antigua de comunicarse entre aplicaciones... no voy a entrar en detalles sobre lo que es el DDE ni nada de eso, ya que hace tiempo que no lo uso y cuando lo usaba simplemente era con ejemplos prefabricados... o casi...

La segunda es usando el Windows Scripting Host (WSH). Seguramente esta forma ser� la preferida para aquellos que dispong�is del Windows 98/2000, (siempre que hayas seleccionado esa opci�n) o bien el Windows 95/NT con el WSH instalado, ya que tambi�n se puede instalar de forma separada desde el sitio de Microsoft:
http://msdn.microsoft.com/scripting/ 

Vamos a ver el c�digo de ejemplo para ambos casos:

Usando DDE 

He dejado los comentarios originales, aunque, lamentablemente ahora no recuerdo qui�n fue el autor de los mismos... lo siento.
El icono s�lo se crear� en la carpeta de Programas del men� de Inicio... con el otro sistema podr�s crearlo en otros sitios diferentes...
Otra de las limitaciones de �ste m�todo es que no se pueden usar s�mbolos "raros" en el nombre del acceso directo, entre los cuales est�n los par�ntesis.

Para usar este ejemplo, crea un nuevo proyecto, a��dele un par de etiquetas y dos textboxes (en uno ir� el nombre del acceso directo y en el otro el path del programa a ejecutar), y un bot�n para crear el acceso directo.

'
'------------------------------------------------------------------------------
' Crear accesos directos usando DDE                                 (14/Ene/00)
'
' Basado en un c�digo para VB2/3 de 1994... por lo menos,
' que a su vez est� basado en otro anterior con las rutinas para trabajar con DDE
' y algunas otras virguer�as (al menos en aquellos tiempos)
'
' �Guillermo 'guille' Som, 199?-2000
'------------------------------------------------------------------------------
Option Explicit

Private Sub cmdCrear_Click()
    ' Crear el acceso directo                                       (14/Ene/00)
    ' Se crear� dentro de Programas del Men� de Inicio
    '
    CrearIconoEnProgMan Me, Text2.Text, Text1.Text
End Sub

Private Sub cmdSalir_Click()
    ' Salir del programa
    Unload Me
End Sub


'----------------------------------------------------------
' Procedure: CrearIconoEnProgMan
'
' Arguments: X           The form where Label1 exists
'
'            CmdLine$    A string that contains the command
'                        line for the item/icon.
'                        ie 'c:\myapp\setup.exe'
'
'            IconTitle$  A string that contains the item's
'                        caption
'----------------------------------------------------------
Private Sub CrearIconoEnProgMan(X As Form, CmdLine$, IconTitle$)
    
    Dim i As Integer, z As Integer
    
    Screen.MousePointer = 11
    ' Poner la primera letra en may�sculas
    IconTitle$ = Left$(IconTitle$, 1) & LCase$(Mid$(IconTitle$, 2))
    
    '----------------------------------------------------------------------
    ' Windows requires DDE in order to create a program group and item.
    ' Here, a Visual Basic label control is used to generate the DDE messages
    '----------------------------------------------------------------------
    On Error Resume Next
    
    '---------------------------------
    ' Set LinkTopic to PROGRAM MANAGER
    '---------------------------------
    X.Label1.LinkTopic = "ProgMan|Progman"
    X.Label1.LinkMode = 2
    For i = 1 To 10         ' Loop to ensure that there is enough time to
      z = DoEvents()        ' process DDE Execute.  This is redundant but needed
    Next                    ' for debug windows.
    X.Label1.LinkTimeout = 100
    
    '------------------------------------------------
    ' Create Program Item, one of the icons to launch
    ' an application from Program Manager
    '------------------------------------------------
    X.Label1.LinkExecute "[AddItem(" & CmdLine$ & Chr$(44) & IconTitle$ & Chr$(44) & ",,)]"
    
    '-----------------
    ' Reset properties
    '-----------------
    X.Label1.LinkTimeout = 50
    X.Label1.LinkMode = 0
    
    Screen.MousePointer = 0
End Sub

Usando el WSH

Ahora vamos a ver el c�digo de la otra forma de crear accesos directos en Windows.
Para crear el c�digo que pondr� a continuaci�n, tendr�s que crear un nuevo proyecto, a�ade tres etiquetas, tres textboxes, un listbox y un bot�n para crear el acceso directo.
La primera caja de textos servir� para introducir el nombre del acceso directo.
La segunda indicar� el path del programa a ejecutar.
La tercera caja de textos indicar� en que sitio queremos crear el acceso directo, el lugar de destino se seleccionar� de las opciones mostradas en el Listbox.

Estos son algunos de los "destinos" de los accesos directos:
AllUsersDesktop
AllUsersStartMenu
AllUsersPrograms
AllUsersStartup

Desktop
Favorites
Fonts
MyDocuments
NetHood
PrintHood
Programs
Recent
SendTo
StartMenu
Startup
Templates

El destino "real" se puede averiguar mediante una llamada al m�todo SpecialFolders del objeto Shell del WSH:
x = SpecialFolders("Desktop") ' Devolver� el path del Escritorio

Un, dos, tres... 
B�sicamente la forma de crear los accesos directos es:

Las variables usadas son del tipo Variant, ya que pueden recibir objetos de cualquier tipo... 

Si prefieres usar los tipos "reales", tendr�s que crear una referencia al objeto Windows Scripting Host Object Model (WSHOM.OCX) y usar los siguientes tipos:

Para el objeto Shell:
Private m_wsShell As IWshShell_Class

Crear una referencia al objeto Shell:
Set m_wsShell = New IWshShell_Class

Una variable para crear accesos directos:
Dim vLnk As IWshShortcut_Class

Obtener una de las carpetas especiales:
sLnkPath = m_wsShell.SpecialFolders.Item(Text3.Text)
(f�jate que hay que usar Item para poder acceder... curioso...)

Crear un acceso directo:
Set vLnk = m_wsShell.CreateShortcut(sLnkPath)

 

Veamos el c�digo del formulario usando objetos del tipo Variant y creando una referencia en tiempo de ejecuci�n (late binding):

'
'------------------------------------------------------------------------------
' Crear accesos directos usando WHS                                 (14/Ene/00)
'
' �Guillermo 'guille' Som, 2000
'------------------------------------------------------------------------------
Option Explicit

Private m_wsShell As Variant

Private Sub cmdCrear_Click()
    ' Crear el acceso directo                                       (14/Ene/00)
    Dim sLnkPath As String
    Dim sLink As String
    Dim sAppPath As String
    Dim vLnk As Variant
    
    sAppPath = Text2
    sLink = Text1
    If InStr(sLink, ".lnk") = 0 Then
        sLink = sLink & ".lnk"
    End If
    ' Crearlo en el escritorio:
    'sLnkPath = m_wsShell.SpecialFolders("Desktop")
    '
    ' Crearlo en el indicado en el listbox
    ' Aunque siempre lo crea en el mismo sitio:
    ' C:\WINDOWS\All Users\Desktop
    ' es decir en el escritorio.
    '
    ' Pero eso era usando TEXT3 a secas,
    ' a�adiendo el .Text ya si que sale lo que debe salir...
    '
    sLnkPath = m_wsShell.SpecialFolders(Text3.Text)
    sLnkPath = sLnkPath & "\" & sLink
    
    ' Crear el acceso directo
    Set vLnk = m_wsShell.CreateShortcut(sLnkPath)
    vLnk.Targetpath = sAppPath
    '
    '--------------------------------------------------------------------------
    ' Enviado el 20/Jun/00 por:
    ' paco diaz, [email protected]
    '
    ' definir directorio de trabajo
    vLnk.WorkingDirectory = "D:\gsCodigo" ' Escribe aqu� el directorio
    '--------------------------------------------------------------------------
    '
    vLnk.Save
End Sub

Private Sub cmdSalir_Click()
    ' Salir del programa
    Unload Me
End Sub

Private Sub Form_Load()
    Set m_wsShell = CreateObject("WScript.Shell")
    
    List1.Clear
    
    ' Llenar el listbox con los "folders" de SpecialFolders
    '
    'Dim vName As Variant

    ' (Este m�todo es preferible si quieres mostrar todos las carpetas especiales)

    'For Each vName In m_wsShell.SpecialFolders
    '    List1.AddItem vName
    'Next
    '
    '
    ' Estos no son v�lidos para el W95
    List1.AddItem "AllUsersDesktop= " & m_wsShell.SpecialFolders("AllUsersDesktop")
    'List1.AddItem "AllUsersStartMenu= " & m_wsShell.SpecialFolders("AllUsersStartMenu")
    'List1.AddItem "AllUsersPrograms= " & m_wsShell.SpecialFolders("AllUsersPrograms")
    'List1.AddItem "AllUsersStartup= " & m_wsShell.SpecialFolders("AllUsersStartup")
    '
    List1.AddItem "Desktop= " & m_wsShell.SpecialFolders("Desktop")
    List1.AddItem "Programs= " & m_wsShell.SpecialFolders("Programs")
    List1.AddItem "StartMenu= " & m_wsShell.SpecialFolders("StartMenu")
    List1.AddItem "Startup= " & m_wsShell.SpecialFolders("Startup")
    List1.AddItem "MyDocuments= " & m_wsShell.SpecialFolders("MyDocuments")
    List1.ListIndex = 0
    '
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set m_wsShell = Nothing
End Sub

Private Sub List1_Click()
    ' Mostrar el destino del acceso directo
    Dim sTmp As String
    Dim i As Long
    
    sTmp = List1.List(List1.ListIndex)
    i = InStr(sTmp, "= ")
    If i Then
        Text3 = Left$(sTmp, i - 1)
    Else
        Text3 = "Desktop"
    End If
End Sub

Bueno, esto es todo... espero que te sea de utilidad...

Nos vemos.
Guillermo


ir al índice