Resumen Cerrar una sesion de MsDos que se abrio con Shell   (2 mensajes )

Hola, mejor ejecuta un batch miprograma.bat

miprograma.exe
exit <----------------- Te cierra la ventana de DOS


Saludos

Gabriel
> ----------
> Desde:     Leyva-Salmeron, Pablo[SMTP:pleyva@ssa.siemens.es]
> Enviado el:     jueves 14 de mayo de 1998 11:22
> Para:     'VB ESP'
> Asunto:     Cerrar una sesion de MsDos que se abrio con Shell
>
> Hola amigos
>
> Alguien sabe si es posible cerrar una sesion MsDos que fue abierta con: ??
>
> Shell "MiPrograma.exe"
>
> Gracias desde ya mismo, y ...
> Saludos
> ++++++++++++++++++++++++++++++++++++
> Pablo Leyva
> Madrid/España
> mailto:pleyva@ssa.siemens.es
> ++++++++++++++++++++++++++++++++++++
> _______________________ Separador de respuesta _____________
>

At 18:22 14/05/98 +0200, you wrote:
>Hola amigos
>
>Alguien sabe si es posible cerrar una sesion MsDos que fue abierta con: ??
>
>Shell "MiPrograma.exe"

En las páginas de Rubí de la Vega (http://www.arrakis.es/~jrubi) puedes ver
un ejemplo. (Y muchos mas, ya que no tienen desperdicio. Enhorabuena Don
José)
Pero ya que te contesto no voy a quedar solamente en decir eso.

De esas páginas saqué ideas suficientes para hacer esto. Lo paso a toda la
lista porque me costó mucho trabajo hacerlo y espero ayudar con esto a que
otros lo tengan mas fácil.

PROBLEMA: Deseo comprimir un fichero antes de enviarlo al correo. Uso el
compresor ARJ.EXE ver. 2.6 que trabaja en DOS. Supongo que todo el mundo lo
conoce. Una vez recibido en destino, lo expando con el mismo compresor.
Utilizo un Procedimiento que he llamado ExecCmdNoFocus, copiado casi al pie
de la letra de dos ejemplos de las páginas citadas.

La declaración de las Apis y Constantes (En la sección de Declaraciones del
Formulario) es la siguiente:

-------------------------------------------------
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess
As Long, lpExitCode As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400
------------------------------------------------

Y estas declaraciones las tuve que poner en un módulo, pues en el
formulario no me las permitió:

-------------------------------------------
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_CLOSE = &H10
----------------------------------------------


El Procedimiento:

--------------------------------------------------

Public Sub ExecCmdNoFocus(ByVal CmdLine As String)

'CmdLine es el parámetro que le voy a pasar cuando invoque este procedimiento.

'Este procedimiento inicia un proceso en DOS y espera a que termine
'Una vez terminado este proceso, cierra la ventana, que se mostrará
minimizada y sin foco

Dim hProcess As Long
'handle del proceso donde se invoca la función Shell
Dim RetVal As Long
'Valor donde la función GetExitCode coloca el resltado
Dim winHwnd As Long
' manipulador de la ventana que contenga el caption Finalizado - ARJ
Dim RetValls As Long
'valor de retorno de PostMessage

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine,
vbMinimizedNoFocus))

Esta línea la tengo de prueba, para cuando me falla (Para cuando me
fallaba). Te presenta la ventana DOS a tope de tamaño. Sustituyes la
anterior por esta y te deja ver los errores que se le presentaron al ARJ

'hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine,
vbMaximizedFocus))

Do
GetExitCodeProcess hProcess, RetVal
Sleep 100
    'en este apartado comprueba si está abierta la ventana "Finalizado - ARJ"
    winHwnd = FindWindow(vbNullString, "Finalizado - ARJ")

La siguiente línea es para cuando fallaba. Sustituia a la anterior.
Poniendo la X final al Finalizado nunca encontrará una ventana con ese
caption, y por lo tanto creerá que la aplicación DOS no ha terminado. Asi
te deja leer los errores que te presenta el ARJ.

   ' winHwnd = FindWindow(vbNullString, "FinalizadoX - ARJ")

    If winHwnd <> 0 Then
    RetValls = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
    End If
Loop While RetVal = STILL_ACTIVE

End Sub

-----------------------------------------------------

La ventana DOS del ARJ tiene el caption Finalizado - ARJ cuando ya ha
terminado el proceso. En el procedimiento ExecCmdNoFocus se analiza si esa
ventana está presente (prueba de que ARJ ya ha terminado, pues antes de
terminar tiene otro caption). El libro de Apleman puede ayudar a entender
esto.

Para llamar a ese procedimiento: (para comprimir)

(DirDocs es una variable quue contiene el directorio donde quiero que me
ponga el fichero comprimido. FICHCOMP es una variable que contiene el Path
y nombre del fichero a comprimir. El ejecutable ARJ.EXE debe estar en
App.Path -directorio donde está la aplicación-). El parámetro CmdLine del
procedimiento es todo lo que va entre parentesis.
------------------------------
ExecCmdNoFocus (App.Path & "\ARJ a -e" & " """ & DirDocs & "" &
"\TMP\temporal"" " & """" & FICHCOMP & """")
---------------------------

Para descomprimir
--------------------------------
ExecCmdNoFocus (App.Path & "\ARJ x -y " & """" & DirDocs &
"\TMP\DescTMP.ARJ""" & " """ & DirDocs & "\TMP""")
-----------------------------------

Para quien conozca el ARJ, el cúmulo de dobles comillas es para que pueda
trabajar con directorios con nombre largo (Mis documentos\TMP.....)

Para aplicarlo a tu programa tendrás que tener un poco de paciencia
cambiando variables y esas cosas. Pero persevera porque el código funciona



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com