Fermeture de Word et lancement d'application

pronche Messages postés 5 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 5 août 2004 - 4 août 2004 à 11:35
pronche Messages postés 5 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 5 août 2004 - 5 août 2004 à 12:06
bonjour!

voila, lorsque je ferme word, je souhaiterias lancer un programme qui va "guetter" la fermeture effective de celui ci (pour s'assurer que l'utilisateur a bien sauvegarer ou non le document apres la boite de dialogue word "sauvegarder et quitter? Oui Non Annuler")...
pour cela je lance une command shell avec des arguments (le path du fichier word en question).

ensuite mon programme attend que le fichier en question ne soit plus marqué comme ouvert... mais voila... cela peu prendre longtemps et en attendant, je fais une boucle infi qui bouffe tout le CPU. ou bien je fasi un sleep(1) qui se repère infiniment et dans ce cas je ne peux pas aller autre part que dans word.. cela freeze les autres applications (a cause de la gestion de priorité aparement)

si qqun pouvais m'aider ce serais génial !
je développe en VB6
voila... en vous remerciant

pronche

2 réponses

lebourgjf Messages postés 29 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 6 août 2004
5 août 2004 à 01:17
Un début de solution (code trouvé je ne sais plus sur quel site. mvps.org ou similaire) :

dans un module :

**************************

Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As Long, ByVal lpCommandLine As String, _
ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

'Type pour gérer les lancements de processus
Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

'Info sur un processus
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Public Enum TypeOpen
Hide = 0
Normal = 1
Minimized = 2
Maximized = 3
Restore = 9
End Enum
Public Enum OP
OpExecute = 1
OpPrint = 2
End Enum

Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const STILL_ACTIVE = &H103&

Public Sub AttendreFinProcess(proc As PROCESS_INFORMATION, Optional timeout As Long = 60)

Dim ret As Long
Dim tms As Single
Dim exitcode As Long

'Attendre la fin de la commande
tms = Timer
ret = GetExitCodeProcess(proc.hProcess, exitcode)
Do While ret <> 0 And exitcode = STILL_ACTIVE
ret = GetExitCodeProcess(proc.hProcess, exitcode)
DoEvents
Sleep 100
If Timer - tms > timeout Then
Err.Raise STILL_ACTIVE, "AttendreFinProcess", "Timeout sur l'attente de la fin d'un process"
End If
Loop
If ret = 0 Then
Err.Raise Err.LastDllError, "AttendreFinProcess", "Erreur systeme N° " & Err.LastDllError
End If

End Sub

Public Sub LancerProcess(sExe As String, proc As PROCESS_INFORMATION)

Dim start As STARTUPINFO
Dim ret As Long

'StartupInfo pour le processus qui lancera la commande
start.cb = Len(start)
'Lancement de la commande
ret& = CreateProcess(0&, sExe, 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
If ret = 0 Then
Err.Raise Err.LastDllError, "LancerProcess", "Erreur systeme N° " & Err.LastDllError
End If

End Sub

**************************

Dans un formulaire (avec un bouton de commande Commande0 :
Test avec NotePad
**************************

Private Sub Commande0_Click()

Dim proc As PROCESS_INFORMATION

On Error GoTo errortag
proc.hProcess = -1
proc.hThread = -1
Debug.Print "Debut du processus"
Call LancerProcess("notepad", proc)
Call AttendreFinProcess(proc)
MsgBox "fin du processus"
Call CloseHandle(proc.hProcess)
Call CloseHandle(proc.hThread)

Exit Sub

errortag:
If proc.hProcess <> -1 Then CloseHandle proc.hProcess
If proc.hThread <> -1 Then CloseHandle proc.hThread
MsgBox Err.Number & " - " & Err.Description
End Sub

************************

Ca fonctionne très bien sous Access 2000. Donc sans doute sous VB6.
0
pronche Messages postés 5 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 5 août 2004
5 août 2004 à 12:06
merci ton truc est génial... a un détail près qui m'embète pas mal...

en fait je me trouve dans une macro Word, et de là je fais un shell
qui lance mon exe qui guette la fin de word...

du coup dans mon exe, je met le code que tu m'as passé et en théorie ca passe... mais le problème (car il y en a un :'() c'est que mon exe en connais pas tous les codes
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
qui correspondent a Word qui vient de le lancer...

malgré tout, merci pour ton aide...
0
Rejoignez-nous