Fallo funcion OpenProcess en migracion de Win2000 a WinXP

22/10/2008 - 12:39 por xcasanovas | Informe spam
Hola,

teniamos creada una macro en la que usabamos la funcion OpenProcess
(declarada como adjunto mas abajo) para saber si una linea de comandos que
ejecutamos des de la misma macro habia acabado o no.

Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long

Esto nos habia funcionado siempre en Excel 2003 cuando usabamos Windows
2000, pero ahora hemos migrado a Windows XP (seguimos con Excel 2003) y ha
dejado de funcionar (ya hemos comprobado que la libreria "kernel32" exista)

Alguién nos podría decir porque? que deberiamos hacer?

Muchas gracias!

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
22/10/2008 - 19:26 | Informe spam
hola, !

teniamos creada una macro en la que usabamos la funcion OpenProcess
(declarada como adjunto mas abajo) para saber si una linea de comandos que
ejecutamos des de la misma macro habia acabado o no.

Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long

Esto nos habia funcionado siempre en Excel 2003 cuando usabamos Windows
2000, pero ahora hemos migrado a Windows XP (seguimos con Excel 2003) y ha
dejado de funcionar (ya hemos comprobado que la libreria "kernel32" exista)

Alguien nos podriaa decir porque? que deberiamos hacer?



para empezar...

- exponer la forma de llamar a la API que comentas

- comentar si tambien tienes declarada la API que monitorea si el proceso sigue activo:
Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long

- comentar cualquier otro detalle que no sea "visible" (para los que estamos de este lado del mensaje)

saludos,
hector.
Respuesta Responder a este mensaje
#2 xcasanovas
23/10/2008 - 10:11 | Informe spam
Hola Hector,

detallo un poco más:

- la API que comentas no la tenemos declarada

- el codigo donde se llama a la API és el siguiente:

Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long

Const PROCESS_TERMINATE = &H1
Const PROCESS_QUERY_INFORMATION = &H400
Const STILL_ACTIVE = &H103
PID = Shell("linea de comando", 1)
hproceso = PID
Do Until hproceso = 0
hproceso = OpenProcess(PROCESS_TERMINATE Or _
PROCESS_QUERY_INFORMATION, 0, CLng(PID))
'Pausa de 2 segundos para no colapsar sistema
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2)
Loop

Esta es la forma que teniamos de esperar a que acabara el proceso para
continuar la macro.

Como dije esto nos habia funcionado bien en Excel 2003 con Wnidows 2000 y
ahora que hemos migrado a Win XP (seguimos con Excel 2003) la macro se queda
en el loop y no sale nunca de él porque aunque el proceso haya acabado, la
variable declarada como "hproceso" nunca da 0.

No se si he aclarado más. He declarado la API que comentabas pero sigue
ocurriendo lo mismo. Alguna solución?

Muchas gracias

Xavi




"Héctor Miguel" wrote:

hola, !

> teniamos creada una macro en la que usabamos la funcion OpenProcess
> (declarada como adjunto mas abajo) para saber si una linea de comandos que
> ejecutamos des de la misma macro habia acabado o no.
>
> Private Declare Function OpenProcess Lib "kernel32" (ByVal _
> dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
> dwProcessId As Long) As Long
>
> Esto nos habia funcionado siempre en Excel 2003 cuando usabamos Windows
> 2000, pero ahora hemos migrado a Windows XP (seguimos con Excel 2003) y ha
> dejado de funcionar (ya hemos comprobado que la libreria "kernel32" exista)
>
> Alguien nos podriaa decir porque? que deberiamos hacer?

para empezar...

- exponer la forma de llamar a la API que comentas

- comentar si tambien tienes declarada la API que monitorea si el proceso sigue activo:
Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long

- comentar cualquier otro detalle que no sea "visible" (para los que estamos de este lado del mensaje)

saludos,
hector.



Respuesta Responder a este mensaje
#3 Héctor Miguel
23/10/2008 - 10:33 | Informe spam
hola, Xavi !

(mas tarde hago pruebas con el codigo que expusiete) :)) (por lo pronto)...

este codigo de ejemplo me funciona bien bajo Win-XP (a reserva de cual sea tu "linea de comando") -?-
(notaras que me gusta "espanolizar" las llamadas a las API's) :))

Private Declare Function AbrirProceso Lib "Kernel32" Alias "OpenProcess" ( _
ByVal Par1 As Long, ByVal Par2 As Long, ByVal Par3 As Long) As Long
Private Declare Function ConsultarProceso Lib "Kernel32" Alias "GetExitCodeProcess" ( _
ByVal Par1 As Long, Par2 As Long) As Long

Sub Proceso_Alterno()
Dim Proceso As Long, Estado As Long, Activo As Long
MsgBox "Se iniciara la calculadora de windows..."
Proceso = AbrirProceso(&H400, 0, Shell("calc.exe", vbNormalFocus))
Do
Estado = ConsultarProceso(Proceso, Activo)
DoEvents
Loop While Activo = &H103
MsgBox "Se ha cerrado la calculadora de windows !"
End Sub

saludos,
hector.

__ OP __
detallo un poco mas:
- la API que comentas no la tenemos declarada
- el codigo donde se llama a la API es el siguiente:

Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessId As Long) As Long

Const PROCESS_TERMINATE = &H1
Const PROCESS_QUERY_INFORMATION = &H400
Const STILL_ACTIVE = &H103
PID = Shell("linea de comando", 1)
hproceso = PID
Do Until hproceso = 0
hproceso = OpenProcess(PROCESS_TERMINATE Or _
PROCESS_QUERY_INFORMATION, 0, CLng(PID))
'Pausa de 2 segundos para no colapsar sistema
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2)
Loop

Esta es la forma que teniamos de esperar a que acabara el proceso para continuar la macro.

Como dije esto nos habia funcionado bien en Excel 2003 con Wnidows 2000
y ahora que hemos migrado a Win XP (seguimos con Excel 2003) la macro se queda en el loop
y no sale nunca de el porque aunque el proceso haya acabado, la variable declarada como "hproceso" nunca da 0.

No se si he aclarado mas. He declarado la API que comentabas pero sigue ocurriendo lo mismo. Alguna solucion?
Respuesta Responder a este mensaje
#4 xcasanovas
23/10/2008 - 16:02 | Informe spam
Perfecto, funciona genial!

Ahora, si descubres porque no funionaba mi codigo no dejes de decirmelo.

Muchisimas gracias!

"Héctor Miguel" wrote:

hola, Xavi !

(mas tarde hago pruebas con el codigo que expusiete) :)) (por lo pronto)...

este codigo de ejemplo me funciona bien bajo Win-XP (a reserva de cual sea tu "linea de comando") -?-
(notaras que me gusta "espanolizar" las llamadas a las API's) :))

Private Declare Function AbrirProceso Lib "Kernel32" Alias "OpenProcess" ( _
ByVal Par1 As Long, ByVal Par2 As Long, ByVal Par3 As Long) As Long
Private Declare Function ConsultarProceso Lib "Kernel32" Alias "GetExitCodeProcess" ( _
ByVal Par1 As Long, Par2 As Long) As Long

Sub Proceso_Alterno()
Dim Proceso As Long, Estado As Long, Activo As Long
MsgBox "Se iniciara la calculadora de windows..."
Proceso = AbrirProceso(&H400, 0, Shell("calc.exe", vbNormalFocus))
Do
Estado = ConsultarProceso(Proceso, Activo)
DoEvents
Loop While Activo = &H103
MsgBox "Se ha cerrado la calculadora de windows !"
End Sub

saludos,
hector.

__ OP __
> detallo un poco mas:
> - la API que comentas no la tenemos declarada
> - el codigo donde se llama a la API es el siguiente:
>
> Private Declare Function OpenProcess Lib "kernel32" (ByVal _
> dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
> dwProcessId As Long) As Long
>
> Const PROCESS_TERMINATE = &H1
> Const PROCESS_QUERY_INFORMATION = &H400
> Const STILL_ACTIVE = &H103
> PID = Shell("linea de comando", 1)
> hproceso = PID
> Do Until hproceso = 0
> hproceso = OpenProcess(PROCESS_TERMINATE Or _
> PROCESS_QUERY_INFORMATION, 0, CLng(PID))
> 'Pausa de 2 segundos para no colapsar sistema
> Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2)
> Loop
>
> Esta es la forma que teniamos de esperar a que acabara el proceso para continuar la macro.
>
> Como dije esto nos habia funcionado bien en Excel 2003 con Wnidows 2000
> y ahora que hemos migrado a Win XP (seguimos con Excel 2003) la macro se queda en el loop
> y no sale nunca de el porque aunque el proceso haya acabado, la variable declarada como "hproceso" nunca da 0.
>
> No se si he aclarado mas. He declarado la API que comentabas pero sigue ocurriendo lo mismo. Alguna solucion?



Respuesta Responder a este mensaje
#5 Héctor Miguel
24/10/2008 - 02:46 | Informe spam
hola, Xavi !

... si descubres porque no funionaba mi codigo no dejes de decirmelo.



(hasta donde se, y) como te decia:... "(a reserva de cual sea tu "linea de comando") -?-"

1) algunas aplicaciones por linea de comandos (metodo Shell) "reaccionan" diferente bajo Win-XP que Win-2000
(y muy probablemente paso algo similar en el salto de Win-95/98 a Win-2000) -?-

2) probando con el codigo que expusiste, encontre dos comportamientos (cambiando algunos parametros)...
o bien, la macro se encuentra con que la aplicacion externa habia "terminado de inmediato" (cosa que no era cierta)
o bien, la macro ni siquiera de enteraba cuando la aplicacion externa es cerrada por el usuario (quedando un bucle-sin-fin)

3) trabajando con aplicaciones externas y el metodo "Shell" bajo Win-Xp...
- si la "linea de comando" cierra su ventana (DOS) luego de terminar (o es cerrada por el usuario)...
puedes combinar las API's OpenProcess, GetExitCodeProcess, con una instruccion DoEvents dentro del "Do...Loop"
- si la "linea de comando" NO cierra su venana (DOS) luego de terminar, y es necesario que VBA la cierre...
puedes combinar las API's OpenProcess, WaitForSingleObject y CloseHandle

4) otra alternativa para que VBA espere por aplicaciones externas "(a reserva de cual sea tu "linea de comando") -?-"
XL2000: Como forzar a codigo de macro que espere procedimiento externo
http://support.microsoft.com/?kbid!4248

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida