• Viernes 15 de Noviembre de 2024, 04:48

Autor Tema:  Re: Ejecutable asociado a una extension de fichero  (Leído 1686 veces)

javirues

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Ejecutable asociado a una extension de fichero
« en: Viernes 12 de Septiembre de 2003, 11:59 »
0
Estoy buscando una funcion que me devuelva el nombre y el path del ejecutable asociado a un extension dada.
pej:Si le paso DOC necesito que me devuelva la cadena "C:Archivos de programas....Winword.exe".
Alguien conoce como puedo hacerlo.
Gracias

JKim

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Ejecutable asociado a una extension de fichero
« Respuesta #1 en: Viernes 12 de Septiembre de 2003, 21:46 »
0
Ejecutar el programa asociado a un archivo.


Javier Ferradás / javferradas@terra.com / 04/12/00

Necesito poder mostrar a mis usuarios el contenido de los archivos de su disco duro independientemente del programa que tengan asociado, de una manera similar a como lo hace el explorador de Windows, que al hacer doble clic sobre un archivo siempre lo abre con el programa adecuado. Puedo analizar la extensión de ciertos tipos de archivo e intentar lanzar el programa más apropiado (el bloc de notas con los .txt, MS Excel con los .xls, etc...) pero no me parece el método más adecuado. ¿Existe alguna forma mejor de hacerlo y que funcione en Visual Basic?

Cuando uno hace doble clic sobre un archivo en el explorador del sistema, Windows sabe cuál es el ejecutable asociado porque dicha información se guarda en el registro. Concretamente, si abrimos la rama HKEY_CLASSES_ROOT podremos ver todos los tipos de archivos registrados. Si nos fijamos en el valor predeterminado de la clave cuyo nombre coincide con la extensión del archivo averiguaremos la denominación del mismo. Si, posteriormente, buscamos en la misma rama esa denominación podremos averiguar el ejecutable asociado, que se encuentra bajo la clave Shell/Open/Command, tal y como se ilustra en la figura adjunta. Según esto, podríamos buscar la información que necesitamos en el registro, usando para ello las funciones de las API correspondientes. Sin embargo, existe una manera mucho mejor incorporada al sistema y que efectúa ese trabajo por nosotros (casi todas las tareas habituales tienen un atajo en la API de Windows). Concretamente, en el caso que nos ocupa podemos usar la función de la API ShellExecute, cuya definición en VB es: Public 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 A continuación incluimos una función que hace exactamente lo que usted desea utilizando la API de Windows. Es una función idéntica a Shell de Visual Basic, pero ejecuta archivos averiguando su ejecutable asociado. Es una función asíncrona (o sea, devuelve el control inmediatamente) y usa las mismas constantes que en VB, por lo que puede sustituirla por cualquier llamada a Shell en su código y le funcionará tanto para ejecutables normales como para archivos. Si escribe, por ejemplo, ShellPlus "C:miarchivo.xls" abriría Microsoft Excel (que es el programa asociado a la extensión XLS), y análogamente con los demás tipos de archivo. Incluimos también una función auxiliar que extrae la ruta a partir de un nombre completo de archivo y que se utiliza desde dentro de ShellPlus.
Public Function ShellPlus(LineaComando As String, Optional Parametros As String, Optional EstiloVentana As Long, Optional ByVal VentanaMadre As Long) As Boolean
Dim i As Long
If IsMissing(EstiloVentana) Then
EstiloVentana = vbNormalFocus
End If
i = ShellExecute(VentanaMadre, vbNullString,
LineaComando, IIf(IsMissing(Parametros) Or (Parametros =
""), vbNullString, CStr(Parametros)), sExtraeRuta(LineaComando), CLng(EstiloVentana))
If i > 32 Then
ShellPlus = True
Else
ShellPlus = False
End If
End Function
Function sExtraeRuta(sNombreCompleto As String) As String
Dim i As Integer
For i = Len(sNombreCompleto) To 1 Step -1
If InStr(":", Mid$(sNombreCompleto, i, 1)) Then Exit For
Next
sExtraeRuta = Left$(sNombreCompleto, i)
End Function
Esta función de la API sirve también para simular hiperenlaces mediante código, abriendo el navegador o el cliente de correo cuando el usuario pulse, por ejemplo, sobre una etiqueta con texto subrayado. Basta escribir en el evento Click:
ShellExecute Me.hwnd, vbNullChar, "http://www.idg.es/pcworld/", "", vbNullChar, vbNormalFocus
para que nos envíe a la página de PC World. José M. Alarcón Aguín.