Comando Shell

Os planteo una duda de programación de Visual Basic: Para ejecutar otras aplicaciones desde el código hay que utilizar el comando Shell:
Ejemplo: shell("notepad archivo1.txt") 'Abre un fichero de texto
shell("notepad archivo2.txt") 'Abre otro fichero de texto
Al ejecutar estas 2 lineas se abre dos veces el Bloc de Notas. Ocurre lo mismo con Ms internet explorer y archivos html. Mi pregunta es ¿es posible ejecutar 2 veces el shell y que unicamente se abra una vez el bloc de Notas o el internet explorer? ¿Se puede hacer esto utilizando en la linea de comandos algún parámetro?

1 respuesta

Respuesta
1
Si el objetivo es lanzar una aplicación y controlar esta, creo que hay que cambiar el punto de vista, no hay que que ver las aplicaciones como una 'simple' aplicación, si no como una Clase que se puede 'instanciar' y por lo tanto controlar.
Por ejemplo si queremos abrir una página web:
Podemos utilizar el método del shell, pero entonces tendremos los 'problemas' que tu comentas, como que si queremos abrir otra página se nos abrirá en otra ventana, no sabremos si se ha abierto la página correctamente, etc.. en definitiva que no podremos controlar la aplicación que hemos ejecutado con el shell.
Desde el punto de vista de las clases, podemos tener controlada la aplicacion/objeto que creamos y tener acceso a sus propiedades, métodos, eventos. Por lo tanto podemos abrir los documentos que queramos con el mismo objeto, saber si se han abierto correctamente, guardarlos en disco, etc... que podemos hacer lo que queramos con la aplicacion/objeto que acabamos de lanzar. Pero no todas las aplicaciones son clases y por lo tanto 'instanciables', la mayoría de las de Microsoft si son 'clases' y por lo tanto podemos tenerlas controladas (Access, Excel, Word, Internet Explorer, etc...)
Los pasos a seguir para utilizar este método seria.
1º Crear un nuevo objeto de la clase que queramos (con CreateObject o haciendo referencia a él)
2º Lo inicializamos y los mostramos en pantalla (o no hace falta que lo mostremos, podemos hacer cosas con el a 'escondidas')
3º Manipularlo...
4º Y luego eliminar el objeto que hemos creado
Te pongo aquí un pequeño ejemplo que he realizado en VB6 de como manejar el IExplorer:
Utilizo un Form con un commandbutton, se tiene acceso a la clase por medio de referencia (menu Proyectos->Referencias-> y marcar la opción 'Microsoft Internet Controls')
Option Explicit
Dim objInternet As InternetExplorer
Private Sub Command1_Click()
'Va a la pagina indicada (www.microsoft.com)
objInternet.Navigate ("http://www.microsoft.com/spain/")
'Espera a que se carge
Do
'Si se ha terminado de cargar
If objInternet.ReadyState = READYSTATE_COMPLETE Then
MsgBox "Pagina terminada de cargar con titulo: " & objInternet.LocationName
Exit Do
'Si no se ha podido cargar
ElseIf objInternet.ReadyState = READYSTATE_UNINITIALIZED Then
MsgBox "No se ha podido cargar la pagina."
Exit Do
End If
DoEvents
Loop
'Probamos la siguiente pagina que queremos ver
objInternet.Navigate ("http://www.google.com")
'Espera a que se carge
Do
'Si se ha terminado de cargar
If objInternet.ReadyState = READYSTATE_COMPLETE Then
MsgBox "Pagina terminada de cargar con titulo: " & objInternet.LocationName
Dim Doc As Object
Dim TotalLinks As Long
Dim Indice As Long
Dim strLinks As String
Set Doc = objInternet.Document
'Obtiene el numero de links de esta pagina
TotalLinks = Doc.links.LENGTH
If TotalLinks <= 0 Then
MsgBox "En esta pagina no se han encontrado links"
Else
'Obtiene la lista de links
For Indice = 0 To TotalLinks - 1
strLinks = strLinks & Doc.links(Indice).href & vbCrLf
Next Indice
'Muestra los links
MsgBox "Los links de esta pagina son " & TotalLinks & vbCrLf & vbCrLf & strLinks
End If
Exit Do
'Si no se ha podido cargar
ElseIf objInternet.ReadyState = READYSTATE_UNINITIALIZED Then
MsgBox "No se ha podido cargar la pagina."
Exit Do
End If
DoEvents
Loop
End Sub
Private Sub Form_Load()
'Crea una nueva instancia del explorador de windows
Set objInternet = New InternetExplorer
'Muestra la ventana y va a la pagina de inicio predeterminada
objInternet.Visible = True
objInte

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas