Ejecutar programa

Necesito me colabores en lo siguiente:
Necesito hacer un programa que cuando el usuario haga un clic sobre un botón, este "ejecute" o "abra" otro programa, puede ser Word, Internet Explorer, etc, pero la cuestión es que necesito un código que busque el .EXE en cualquier ubicación del disco duro, no necesariamente en una misma ruta o path.
¿Cómo hago?
Respuesta
1
::Siento haber tardado bastante, pero hay que ganarse el pan! Y ésto por desgracia no da "ná de ná".
::En fin, cuando hablas de abrir una aplicación como Word o Internet Explorer supongo que lo que en realidad quieres es abrir un documento (y la aplicación asociada a él).
::Indícame tu mail y te envío un ejemplo práctico (incluso visualiza el icono de Word o de lo que sea). De todas maneras te indico:
::Declara al principio de un formulario lo siguiente:
'------------------------
'Código para el Modulo
'Funcion que busca el ejecutable
Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
'Funciones para el icono
'hDC- Device context of the control to be drawn to
'x, y- coordinates of where to draw the icon in the control
'hIcon-Handle of an icon
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
'hinst- The instance handle of the application calling ExtractIcon. Should be the name of your EXE file, or VB.EXE at runtime
'lpszExeName- Module containing icons
'iIcon%- number of the icon in the file. If you put -1 for this, it returns the amount of icons in a file
'The return value should be: 1)An icon handle 2)1 if it's not a EXE, DLL, or ICO file 3)NULL if no icons are in a file
Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
'lpModuleName- The filename of a module, to get the handle of it.
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
'-----------------------
::Añade un picturebox y un botón, cuyo código en el evento click será:
'--------------------
'Código para el procedimiento
'Definimos las variables
Dim CadenaResultante As Long
Dim AplicacionAsociada As String * 255
Dim Fichero As String
Dim FicheroEjecutable As String
Dim NumeroIconos As Integer
Dim Icono As Long
Dim Res As Long
'Inicializamos las variables
Fichero = InputBox("Dime ruta completa del fichero!!", "Dime nombre fichero")
CadenaResultante = FindExecutable(Fichero, "", AplicacionAsociada)
'mostramos el resultado
If Not IsEmpty(AplicacionAsociada) Then
Print Left(AplicacionAsociada, (InStr(AplicacionAsociada, Chr(0))) - 1)
FicheroEjecutable = Left(AplicacionAsociada, (InStr(AplicacionAsociada, Chr(0))) - 1)
End If
'mostramos el icono de la aplicación
NumeroIconos = ExtractIcon(0, FicheroEjecutable, -1)
If NumeroIconos > 0 Then
Icono = ExtractIcon(0, FicheroEjecutable, 0)
Res = DrawIcon(Picture1.hdc, 0, 0, Icono)
End If
'---------------------
::Ejecútalo y clica el botón.
Si tienes dudas dímelo.
::Miguel Ángel.
Bueno, aunque algo tarde me es de gran ayuda.
Gracias.
::Vaya, se me olvidaba!
Añade tras "RES = Drawico..."
lo siguiente:
'-------------------------
Shell Left(AplicacionAsociada, (InStr(AplicacionAsociada, Chr(0))) - 1) & " " & Fichero
'-------------------------
::Hay otras maneras (incluso más simples) de hacerlo todo esto, pero no tengo mi colección de código aquí a mano ;)
Miguel Ángel.

5 respuestas más de otros expertos

Respuesta
1
¿Qué pena conmigo?
A ver, si te doy una función llamada seekfile que tiene unos parámetros SearchFile y searchPath... pues se llama como cualquier función.
SeekFile "c:\", "winword.exe"
Si quieres guardar el path ( que es tu caso ), pues lo pones dentro de una variable.
Path = SeekFile ("c:\","winword.exe")
Así puedes controlar si está vacío o no, lo que te indicará la existencia del archivo.
Luego solo tienes que llamar la instrucción shell con este path para abrir el archivo.
Magne
Oye, eres supremamente amable y exacto en tus aclaraciones, quiero molestarte en un último detalle:
Cuando abro Word, o cualquier otro programa, este queda como en segundo plano, no queda en primer plano como por ejemplo para empezar a escribir, me toca hacer un clic en la barra de tareas y luego sí.
¿Cómo hiciera para que el programa, quedara de una -en primer plano- para empezar a escribir?
Gracias y disculpa lo canson que soy.
Aquí tienes un código más o menos estándar.
Esta función deberí hacerte una búsqueda recursiva partir del searchpath que el pases ("c:\" por ejemplo ) del filename que le pases.
La función devuelve el path completo del archivo deseado. Este path lo debes introducir en la instrucción Shell para ejecutar el archivo deseado.
El filename debe estar completo (archivo. Extensión")
Private Declare Function SearchTreeForFile Lib "ImageHlp.dll" (ByVal lpRoot As String, ByVal lpInPath As String, ByVal lpOutPath As String) As Long
Function SeekFile(ByVal SearchPath As String, ByVal FileName As String) As String
Dim buffer As String
buffer = String$(&H400, 0)
If SearchTreeForFile(SearchPath, FileName, buffer) Then
SeekFile = Left$(buffer, InStr(1, buffer, vbNullChar) - 1)
End If
Si tienes algún problema no dudes en comentármelo.
Magne
Ahora que lo leo bien, me he dejado el End Function al final de todo :P
De pronto es que no he interpretado lo que me dices, por ejemplo: ¿Dónde escribo el archivo .exe para ejecutarlo?
Ejemplo: donde escribo winword.exe, ¿para qué llame a word?
Gracias
Esto lo tienes que hacer cuando llames a la función, o sea cuando el usuario haga click en el botón "ejecutar word" tu llamas a la función pasándole como parámetros "c:\" y "winword.exe"
Suerte
Magne
¿Qué pena contigo, y como llamo la función?
Private Sub Command1_Click()
???????????????
End Sub
Gracias, eres muy amable.
Si miras la ayuda del Shell, puedes ver que aparte de la ruta del archivo a ejecutar, puedes poner opciones de como se abrirá la nueva ventana ( maximizada, minimizada, etc)
Por ejemplo para que el word te aparezca maximizado y preparado para escribir, solo tienes que añadir a la instrucción Shell que ya tienes, lo siguiente.
, vbMaximizedFocus
Esto debería solucionar el problema :)
Magne
Respuesta
1
Ya te envíe la información
Gracias, eres muy amable por ser tan colaborador conmigo.
Voy a pensar que sabes utilizar Dir() y como ayuda lo que puedes hacer es partir de c: y buscar en todas las subcarpetas, ¿como buscas en las subcarpetas, aho te mando el código que te devuelve todas las subcarpetas de determinado directorio, modifícalo un poco para que haga lo que tu deseas
Function TodasCarpetas(Direc As String) As Variant
Dim DirTemp
Dim DirFinal() As Variant
'Asegura que termine "\"
If Mid(Direc, Len(Direc), 1) <> "\" Then Direc = Direc & "\"
'Verifica que exista
If Dir(Direc, vbDirectory) = "" Then
TodasCarpetas = ""
Exit Function
End If
DirTemp = Subcarpetas(Direc)
On Error GoTo Fin
ReDim DirFinal(0 To UBound(DirTemp, 1))
DirFinal(0) = Direc
Debug.Print UBound(DirTemp, 1)
For i = 1 To UBound(DirTemp, 1)
DirFinal(i) = DirTemp(i)
Next i
TodasCarpetas = DirFinal
Exit Function
Fin:
'si No devuelve nada , No tiene subdirectorios
If Err.Number = 9 Then
ReDim DirFinal(0 To 0)
DirFinal(0) = Direc
TodasCarpetas = DirFinal
End If
End Function
Function Subcarpetas(Raiz As String) As Variant
Static SubCar() As String
Static TotCarp As Long
Dim i As Long
Dim CarTemp As String
'Dim Encont As Boolean
CarTemp = Dir(Raiz, vbDirectory)
While CarTemp <> ""
'Verifica que la carpeta no se . o ..
If CarTemp <> "." And CarTemp <> ".." Then
'Verifica que sea un directorio
If (GetAttr(Raiz & CarTemp) And vbDirectory) = vbDirectory Then
CarTemp = Raiz & CarTemp & "\"
'si no existen carpetas en matriz
If TotCarp <> 0 Then
If Encont(CarTemp, SubCar) = 0 Then
TotCarp = TotCarp + 1
ReDim Preserve SubCar(TotCarp)
SubCar(TotCarp) = CarTemp
Subcarpetas (CarTemp)
CarTemp = Dir(Raiz, vbDirectory)
End If
Else
TotCarp = TotCarp + 1
ReDim Preserve SubCar(TotCarp)
SubCar(TotCarp) = CarTemp
Subcarpetas (CarTemp)
CarTemp = Dir(Raiz, vbDirectory)
End If
End If
End If
CarTemp = Dir
Wend
Subcarpetas = SubCar()
End Function
Function Encont(Direct As String, Matriz As Variant) As Integer
Dim i As Long
Encont = 0
For i = 1 To UBound(Matriz, 1)
If Matriz(i) = Direct Then
Encont = 1
Exit For
End If
Next i
End Function
Cualquier duda házmelo saber
Me parece muy interesante tu código, la verdad es que no se como se utiliza el dir(), y tengo otra pregunta, si quisiera ejecutar Word, ¿dónde coloco windord.exe?
¿Me lo podrías colocar como ejemplo?
Gracias.
Entonces dejame entender, se suponde que en tu aplicación no sabes donde esta un archivo por ejemplo winword.exe, ¿lo qué necesitas es buscarlo y al encontrarlo ejecutarlo?, dime si estoy en lo correcto, o si tu pregunta es como llamar a otra aplicación si ya sabes la ruta, lo único que tendrías que hacer es: Shell("c:\carpeta\winword.exe") y listo.
Gracias por el interés a mi pregunta, es lo primero que me dices: Sé que el ejecutable se llama winword.exe, y necesito un código que ubique en cualquier carpeta este programa. . . y lo ejecute.
Gracias nuevamente.
Pásame tu correo, ya modifique el código para que puedas hacerlo...
Respuesta
1
A ver, te lo he puesto...
A veces me da la impresión de que no leéis las respuestas.
Si con shell ejecutas el comando, y con la función que te he pasado generas el path
Concatena ambas con el "\" en medio y voila...
De este modo :
shell (strGetPathArchivo(strNom ,True,"C:\") & "\" & strNom)
Venga, pruébalo y me confirmas si me he equivocado en algo, que no tengo el Visual basic aquí y no puedo probarlo.
Gracias, eres muy amable por tu colaboración.
Para hacer la búsqueda del ejecutable en cuestión, has de partir de la base de que de dicho archivo sabes cual es el nombre. Te pongo el ejemplo de una función que haga ese trabajo, para ella has de añadir una referencia que simplifica el tratamiento de los archivos. La referencia es Microsoft Scripting Runtime, y la añades en el menu Project/References. Esta es la función :
Private Function strGetPathArchivo(ByVal strNom As String, blnPathCorto As Boolean, strPathInicio As String) As String
Dim fs As New FileSystemObject
Dim archivo As File
Dim Carpeta As Folder
Dim SubCarpeta As Folder
Dim PathArchivo As String
Dim blnEncontrado As Boolean
On Error GoTo Fallo
PathArchivo = ""
Set Carpeta = fs.GetFolder(strPathInicio)
blnEncontrado = False
For Each archivo In Carpeta.Files
If UCase(archivo.Name) = UCase(strNom) Then
blnEncontrado = True
PathArchivo = IIf(blnPathCorto, Carpeta.ShortPath, Carpeta.Path)
End If
Next
If Not blnEncontrado Then
For Each SubCarpeta In Carpeta.SubFolders
PathArchivo = strGetPathArchivo(strNom, blnPathCorto, SubCarpeta.Path)
If PathArchivo <> "" Then
strGetPathArchivo = PathArchivo
Exit Function
End If
Next
End If
strGetPathArchivo = PathArchivo
Exit Function
Fallo:
strGetPathArchivo = ""
End Function
Con esa función, obtienes el path del archivo en disco. En la primera ruta que encuentre para.
Para ejecutarlos, te vale una llamada al comando shell.
shell (path & nombre)
Con ello serviría.
Respuesta
1
Puedes hacerlo de la siguiente manera:
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
Const SW_SHOWNORMAL = 1
Private Sub Form_Load()
ShellExecute Me.hwnd, "open", "c:\temporal\este.doc", vbNullString, "C:\temporal", SW_SHOWNORMAL
End Sub
Este código te abre un documento word (c:\temporal\este.doc) al abrir el formulario.
Bueno, te soy sincero: Lo que necesitaba era que al hacer clic sobre un botón, se abriera word, esteviese donde estuviese el ejecutable (winword.exe), más sin embargo, tu respuesta es muy buena, ya que me permite abrir cualquier archivo, previamente creado.
Eres muy gentil. Gracias.
Respuesta
1
Es que vos no podes decirle que VB abra el programa que quieras por arte de magia, es obvio que le tienes que especificar un path.
En tu caso seria
Shell "C:\Archivos de programa\Microsoft Office\winword.exe"
Sino lo que te conviene es ejecutar accesos directos o cosas por el estilo, pero primero le vas a tener que especificar la ruta, si o si
Mira que si se puede, sin necesidad de magia:
Private Declare Function SearchTreeForFile Lib "ImageHlp.dll" (ByVal lpRoot As String, ByVal lpInPath As String, ByVal lpOutPath As String) As Long
Function SeekFile(ByVal SearchPath As String, ByVal FileName As String) As String
Dim buffer As String
buffer = String$(&H400, 0)
If SearchTreeForFile(SearchPath, FileName, buffer) Then
SeekFile = Left$(buffer, InStr(1, buffer, vbNullChar) - 1)
End If
End Function
Private Sub Command1_Click()
'SeekFile "c:\", "winword.exe"
Path = SeekFile("c:\", "winword.exe")
Shell Path
End Sub
De todas formas gracias.
Bueno el comando que necesitas se llama Shell, o sino podes usar la API que creo que se llama ShellExecute, y lo que necesitas para buscar el archivo te conviene poner un CommonDialog y le das un ShowOpen para que te abra el cuadro de dialogo de abrir archivo, ahí lo vas a buscar, si lo que quieres es buscar un archivo en el disco, avisame y te paso un código que es para localizar un archivo automáticamente y ya.
Saludos./

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas