RE:Usa la API ShellExecute
Hola amigo Alberto.
Pues, referente a lo que preguntas, existe una API capaz de realizar semejante operación, es decir, existe una API para abrir cualquier tipo de archivo, ya sea ejecutable o un archivo cualquiera, con la condición de que este útlimo se abrirá siempre con el programa que le ha sido ajudicado.
Por ejemplo, si se trata de un documento de Word, se abrirá el documento dado en Word, si es una hoja de Excel, pues se abrirá dicha hoja en Excel, etc.
Esa API se llama ShellExecute y esta es su declaración:
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
Parámetros:
hwnd - especifica la ventana principal que mostrará los mensajes enviados por la aplicación. Por ejemplo, errores u otros mensajes de advertencia.
lpOperation - cadena de texto (String) que determina la operación a hacer. Opciones posibles:
"open" - abre un archivo (ejecutable o documento) o carpeta
"print" - imprime un archivo si es un documento o abre un archivo ejecutable, es decir, en ejecutables tiene el mismo efecto que "open".
"explore" - abre con el Explorer la carpeta (tiene el mismo efecto que "open" en carpetas)
Las operaciones siempre hacen referencia al archivo o carpeta especificado en lpFile.
Si lpOperation es nulo es como si tuviera escrito "open" (abre el archivo).
lpFile - cadena de texto (String) que determina el archivo a abrir, documento a imprimir, carpeta a explorar, etc
lpParameters - si el archivo es un ejecutable lpParameters contiene un String con los parámetros necesarios para dicho programa.
Si se trata de un documento, debe ser nulo ("")
lpDirectory - String que contiene el directorio del archivo, documento o carpeta contenido en lpFile
nShowCmd - determina como será mostrado lpFile si se trata de un ejecutable. Si lo que deseas abrir se trata de un documento o carpeta, debe ser nulo (0)
Algunos de los parámetros más útiles que puede contener son:
SW_HIDE - muestra la ventana en segundo plano
SW_MAXIMIZE - muestra la ventana maximizada
SW_MINIMIZE - muestra la ventana minimizada
Estos son tres de los más usados pero puedes encontrar más buscando información sobre la API de Visual Basic ShellExecute (en Google o en la web Microsoft)
Aquí termina la información que te puedo dar acerca de esta API.
A continuación, escribo un ejemplo de como utilizarla:
En un formulario de un nuevo proyecto un CommandButton (Command1).
Y, en el editor de código de formulario, escribe el siguiente código:
'==============================================================================================================================
'CÓDIGO PARA ABRIR CUALQUIER TIPO DE ARCHIVO (EJECUTABLE O DOCUMENTO CON SU APLICACIÓN RELACIONADA)
'==============================================================================================================================
'La declaración de la API necesaria(ShellExecute)
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
Private Sub Command1_Click()
'Se llama a la función ShellExecute para abrir un documento de Word
'llamado documentoword.doc
'situado en el directorio C:\
'La ventana principal (la que recibirá los mensajes de la aplicación)
'será el formulario actual Me (Form1)
'La operación a realizar es abrir el archivo ("open"), aunque si se deja
'en nulo dicho parámetro (lpOperation) también haría lo mismo la línea de código
'El siguiente parámetro, lpFile contiene el nombre del archivo sin el directorio (Path), que
'en mi caso es "documentoword.doc"
'Después tenemos el parámetro lpParameters que es nulo ("") puesto que
'el archivo a abrir no es un ejecutable y no debemos pasarle parámetros
'Añadimos la ruta de directorio, en mi caso en "C:\"
'El último parámetro lo dejamos nulo, puesto
'que la aplicación no es un ejecutable y no debemos
'especificar cómo mostrará la ventana
ShellExecute Me.hwnd, "open", "documentoword.doc", "", "C:\", 0
End Sub
'==============================================================================================================================
Antes de ejecutar este código debes asegurarte de que creas el archivo "documentoword.doc" en el directorio "C:\ (C:\documentoword.doc)
Después de hacerlo, si pulsas el CommandButton del formulario se abrirá dicho archivo con Word.
Lo mismo puedes hacer con cualquier tipo de archivo.
Aquí te doy una lista con todos los valores que devuelve:
Si la función se realiza correctamente, el valor de retorno es el handle de la aplicación ejecutada o el handle de una "dynamic data exchange" (DDE - intercambio de datos dinámico) de una aplicación del servidor
Si la función falla, el valor de retorno es uno igual o menor a 32. Aquí listo todos estos valores:
0
El Sistema Operativo no tiene memoria suficiente
ERROR_FILE_NOT_FOUND
No se encontró el archivo especificado
ERROR_PATH_NOT_FOUND
No se encontró el directorio especificado
ERROR_BAD_FORMAT
El archivo ejecutable .EXE es inválido (no un .EXE para Win32 o la imagen de .EXE es errónea)
SE_ERR_ACCESSDENIED
El Sistema Operativo ha denegado el acceso al archivo especificado
SE_ERR_ASSOCINCOMPLETE
La asociación del nombre de archivo es incompleta o inválida
SE_ERR_DDEBUSY
La transacción DDE no pudo ser completada porque otras transacciones DDE estaban en proceso.
SE_ERR_DDEFAIL
La transacción DDE falló.
SE_ERR_DDETIMEOUT
La transacción DDE no pudo ser completada porque la demanda expiró el tiempo límite.
SE_ERR_DLLNOTFOUND
La DLL especificado no pudo ser encontrada
SE_ERR_FNF
No se encontró el archivo especificado
SE_ERR_NOASSOC
No existe ninguna aplicación asociada con la extensión de archivo dada.
SE_ERR_OOM
No hay suficiente memoria para completar la operación
SE_ERR_PNF
No se encontró el directorio especificado
SE_ERR_SHARE
Ha ocurrido una violación de archivos compartidos
Espero que toda esta información que te ha dado sobre la API ShellExecute (que me ha costado, todo se debe decir, bastante tiempo de recopilar)
te ayude lo más posible.
Hasta otra,
Zoto