Programación General > Visual Basic 6.0 e inferiores
Re: Como Saber si un fichero esta abierto...
javirues:
Hola amigos:
Mi problema es el siguiente: en un momento de la plicacion el usuario podra abrir un fichero y modificarlo o no, pero debo conseguir que la plicacion espere a que el fichero se cierre para continuar, el problema es que no se como ejecurta y que la plicacion este en modo espera, shell no espera a que termione la ejecucion y no se me ocurre como hacerlo, ¿no existe una ejecucion en modo atendido?.
Gracias por adelantado
Brroz:
Hola javirues.
Para ejecutar un proceso de forma síncrona, utiliza algo asín:
Private Const STILL_ACTIVE = &H103
Private Const PROCESS_QUERY_INFORMATION = &H400
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
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Sub SincMiProceso(ByVal ExeFile As String)
On Error GoTo Err_Sinc
Dim lngPid As Long, lngRc As Long
lngPid = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(ExeFile, vbNormalFocus))
Do
GetExitCodeProcess lngPid, lngRc
Sleep 100
DoEvents
Loop While lngRc = STILL_ACTIVE
Exit Sub
Err_Sinc:
MsgBox "Fallo sincronizando pgm '" & ExeFile & "'." & String(2, vbCrLf) _
& "(" & Err.Number & ") " & Err.Description, vbCritical, "Sincronizar"
End Sub
También podrías hacer un 'Open' del archivo y supervisar el error que se producirá si el fichero está abierto.
Espero que te sirva.
Abur.
javirues:
Gracias Brroz pero no me termina de funcionar, pq lo que esta buscando es el process id de word(en este caso) y si tengo dos documentos distintos, como comparten el mismo pid, hasta que no se cierran los dos no devuelve el control.Un word se puede ejecutar desde la aplicacion(este hay que controlarlo) y el otro podria estar abierto pq sí.
De todas formas seguire investigando por esta via, muchas gracias por tomarte la molestia...
Brroz:
Efectivamente, el ejemplo anterior sirve para sincronizar un proceso lanzado por nosotros. Para lo que tú quieres tal vez te sirva esto:
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = -1&
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Sub SincProceso(ByVal TituloVentana As String)
On Error GoTo Err_Sinc
Dim pid As PROCESS_INFORMATION
Dim lngRc As Long
lngRc = FindWindow(vbNullString, TituloVentana)
lngRc = GetWindowThreadProcessId(lngRc, pid.hProcess)
lngRc = OpenProcess(SYNCHRONIZE, False, pid.hProcess)
If lngRc <> 0 Then
lngRc = WaitForSingleObject(lngRc, INFINITE)
Exit Sub
End If
Err_Sinc:
MsgBox "Fallo sincronizando ventana '" & TituloVentana & "'." & String(2, vbCrLf) _
& "(" & Err.Number & ") " & Err.Description, vbCritical, "Sincronizar"
End Sub
A ver si esto te va mejor. 'TituloVentana', evidentemente es el título de la ventana que queremos controlar cuando se cierra...
Suerte.
javirues:
Perdona Brozz, pero despues de dos dias contodo este mogollon creo que cada vez voy mas para atras, no encuentro la conbinacion perfecta para solucionar este tema.La maldita aplicacion esta quieren que ejecute un fichero word ( no se si hacerlo con CreateProcess o con ShellExecute), pero en cualquier caso, la plicacion debe quedar parada en ese momento hasta que el fichero se cierre.
He conbinado esto de varias maneras, pero en casi todos los casos he encontrado errores cuando tengo otro word abierto o lo quiero abrir mientras el de la plicacion se esta viendo(lo abro por fuera o desde el mismo word abierto), esto se debe a que usan el mismo proceso. He probado ahora con el WaitForSingleObject con INFINITE pero la aplicacion no para y si para me cuelga todo el Word y no puedo abrir otro.Se que esto es un poco de locos pero ya no se que hacer me duele el cabezon de tanto darle, ¿se te ocurre algo?
Gracias y perdona por darte tanto el coñazo.
Navegación
[#] Página Siguiente
Ir a la versión completa