el Guille, la Web del Visual Basic, C#, .NET y más...

Ejecutar un acceso directo desde VB6 con ShellExecute

 
Publicado el 15/Ago/2007
Actualizado el 15/Ago/2007
Autor: Guillermo 'guille' Som

Ejemplo de cómo ejecutar un acceso directo (.lnk) desde VB6 con la función del API ShellExecute. (En realidad sirve para abrir cualquier tipo de documento o ejecutable.) También te explico cómo usar Drag and Drop (arrastrar y soltar) en las aplicaciones de Visual Basic 6.0.

 


 

Introducción:

Pues eso, aunque estoy seguro que esto que te voy a explicar ya está publicado en otra parte de mi sitio, hace un rato me hizo falta, y la verdad es que no encontré nada concreto, o al menos que dejara claro que era para ejecutar un acceso directo.

De todas formas, si que encontré un ejemplo de mi amigo Joe LeVasseur sobre cómo usar la función del API ShellExecute, que es en realidad lo único que hace falta para ejecutar un acceso directo, aunque esa misma función sirve para ejecutar lo que quieras, ya que como dice mi amigo Joe, con esa función es "como si hicieras doble clic".

 

Un ejemplo para ejecutar accesos directos y más...

Ya puestos a probar, me he dicho, vamos a hacer las cosas "bien", o al menos como a mi me gustaría que fuera esa "utilidad" o ejemplo para ejecutar cualquier acceso directo.

Y lo que he hecho es agregarle funcionalidad al formulario para que haga lo siguiente:

  1. Acepte ficheros con Drag & Drop
  2. Adapte los controles al cambiar el tamaño del formulario
  3. Y, por supuesto, que ejecute lo que indiquemos

El aspecto del formulario en ejecución es como el mostrado en la figura 1:

Figura 1. La aplicación en funcionamiento
Figura 1. La aplicación en funcionamiento

Y como puedes adivinar solo tiene dos controles: un botón (btnEjecutar) y una caja de textos (Text1).
Te lo digo más que nada por si quieres crear el ejemplo por ti mismo, ya que aquí abajo solo te muestro el código, pero no hay ningún ZIP con el proyecto completo.

 

Un detalle, aunque no es "crucial" para lo que vamos a ver, pero al menos te servirá de información:
Los accesos directos en realidad son ficheros con la extensión .lnk que contiene información del programa que queremos ejecutar, y el ShellExecute lo maneja perfectamente.

Y otro detalle más, aunque este si que es más importante:
Cuando ejecutas cualquier cosa con esta aplicación de ejemplo, debes saber que aunque cierres la aplicación, si eso que ejecutas sigue funcionando, el sistema operativo mantendrá "pillado" al ejecutable, por tanto no te permitirá eliminarlo, moverlo ni nada que altere el path o ruta en la que está.
Eso se soluciona cerrando todas las aplicaciones que se hayan abierto desde ese programa.

 

Nota:
Aclarar, que al menos en teoría, este código vale para cualquier versión de Visual Basic de 32 bits, es decir: Visual Basic 4.0, Visual Basic 5.0 o Visual Basic 6.0.

Si quieres ver un ejemplo para hacer lo mismo pero con Visual Basic para .NET (o con C#), mira esto:
Ejecutar un acceso directo desde Visual Basic o C# con la clase Process

 

El código

Y una vez hechas estas aclaraciones, veamos el código para que esto funcione.

Empecemos viendo la declaración de la función del API ShellExecute, que como la vamos a declarar en el propio formulario, debe estar definida como "privada":

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
    "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
    ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Ahora veamos el código del botón que ejecutará lo que haya en la caja de textos Text1:

Private Sub btnEjecutar_Click()
    ' Ejecutar un acceso directo
    Call ShellExecute(Me.hWnd, "Open", Text1.Text, "", "", 1)

End Sub

A continuación veamos el código que permite aceptar ficheros con Drag & Drop, para que esto funcione, la propiedad OLEDropMode del formulario y del textBox debe tener el valor 1 'Manual.

Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, _
            Button As Integer, Shift As Integer, X As Single, Y As Single)
    Text1.Text = Data.Files(1)
End Sub

Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, _
            Button As Integer, Shift As Integer, X As Single, Y As Single)
    Text1.Text = Data.Files(1)
End Sub

Por último veremos el código del evento Resize del formulario en el que posicionaremos el botón para que esté en la parte de la derecha y el textBox para que se "alargue". Los valores usados son "manuales", es decir, miré los que tenía que usar con cada uno de los controles... es lo malo de Visual Basic 6 comparado con Visual Basic .NET en que esto se hace automáticamente, pero... eso es lo que hay...

Private Sub Form_Resize()
    If Me.WindowState = vbNormal Then
        Me.Text1.Width = Me.ScaleWidth - 405
        Me.btnEjecutar.Left = Me.ScaleWidth - 1470
    End If
End Sub

 

Y esto es todo... espero que te sea de utilidad.

Nos vemos.
Guillermo

P.S.
Para los curiosos: Desde hace meses que no tengo el Visual Basic instalado en mi equipo, y cada vez que lo tengo que usar debo abrir una máquina virtual en la que lo tengo instalado junto con otros de los "Basic" "obsoletos": Visual Studio .NET 2003, además de mi "querido" compilador de BASIC 7.1 (para MS-DOS).
Por "obsoleto" no quiero decir que no sean válidos, sino que yo ya no los utilizo en el "día a día", pero como de vez en cuando "los necesito", pues... en algún sitio los tengo que tener, je, je.

 





La fecha/hora en el servidor es: 23/12/2024 10:40:33

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024