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:
- Acepte ficheros con Drag & Drop
- Adapte los controles al cambiar el tamaño del formulario
- 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
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.