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 SubUsando 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 EscritorioUn, dos, tres...
B�sicamente la forma de crear los accesos directos es:
- Crear una referencia al objeto Shell del Scripting Host:
Set wshShell = CreateObject("WScript.Shell")- Llamar al m�todo CreateShorcut:
Set vLnk = wshShell.CreateShortcut(sLnkPath)- Asignar el path de destino:
vLnk.Targetpath = sAppPath- y guardar los datos...
vLnk.SaveLas 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 SubBueno, esto es todo... espero que te sea de utilidad...
Nos vemos.
Guillermo