Flohe
Messages postés4Date d'inscriptionmardi 27 janvier 2009StatutMembreDernière intervention23 mars 2009
-
23 mars 2009 à 11:55
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
23 mars 2009 à 13:25
Bonjour,
Je souhaite à partir d'une application Access lancer une instance de Word d'une version bien précise, alors que sur le poste, plusieurs versions de word sont déjà installées (97 à 2007...).
A partir du chemin de l'exécutable de la verison 97 par exemple, et une instruction Shell, j'arrive à lancer Word, je suis capable, via l'API FindWindow de récupérer son Handle, mais je n'arrive pas à associer à une variable Word.Application ce Handle.
Exemple :
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Function OuvertureWord() As Word.Application
Dim ObjWd As Word.Application
Dim StrExe As String
Dim numFenetre as Variant
Do While Isempty(NumFenetre) Or NumFenetre=0
NumFenetre=FindWindow(vbNullString, "Document1 - Microsoft Word")
Doevents
Loop
End Function
J'arrive donc à récupérer un numéro dans NumFenetre, mais je ne sais pas comment le réutiliser pour l'associer à ma variable ObjWd.
Je tiens à préciser que je ne peux pas utiliser les instruction New Word.Application, ni CreateObject qui ne me permettent pas de choisir la version...
Si vous savez (en plus) comment récupérer le Handle SANS le titre qui peut dépendre de la langue, mais plutôt de l'EXE...
Si vous avez une idée ou une piste... Elle sera la bienvenue !
Flohe
Messages postés4Date d'inscriptionmardi 27 janvier 2009StatutMembreDernière intervention23 mars 2009 23 mars 2009 à 12:15
Merci pour ta proposition rapide.
J'ai testé cette fonction, mais même dans une boucle pour attendre que le processus soit réellement temriné, le GetObject me renvoie toujours Nothing...
Do While IsEmpty(NumFenetre) Or NumFenetre = 0
NumFenetre = FindWindow(vbNullString, "Document1 - Microsoft Word")
Set ObjWd = GetObject(StrExeWord)
Err.Clear
Loop
Je ne comprends pas pourquoi, d'où une tentavie par le Handle...
Flohe
Messages postés4Date d'inscriptionmardi 27 janvier 2009StatutMembreDernière intervention23 mars 2009 23 mars 2009 à 12:24
Réponse précédente avec les retours à la ligne...
Merci pour ta proposition rapide. J'ai testé cette fonction, mais même dans une boucle pour attendre que le processus soit réellement temriné, le GetObject me renvoie toujours Nothing...
Do While IsEmpty(NumFenetre) Or NumFenetre = 0
NumFenetre = FindWindow(vbNullString, "Document1 - Microsoft Word")
Set ObjWd = GetObject(StrExeWord)
Err.Clear
Loop
Je ne comprends pas pourquoi, d'où une tentavie par le Handle...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Flohe
Messages postés4Date d'inscriptionmardi 27 janvier 2009StatutMembreDernière intervention23 mars 2009 23 mars 2009 à 12:37
En fait, je tentais une récupération par l'EXE... (au cas où une autre instance d'une autre version de Word est déjà ouverte...)
Je fais des tests avec la récupération par la classe et reviens donner les résultats !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 23 mars 2009 à 13:25
tu peux parcourir la ROT (RunningObjectTable) a ta guise...
et récupérer précesément ton instance... reste a l'identifier.
maintenant, tout dépend de ce que tu souhaites faire, au final.
si tu fais un GetObject, tu pourras recuperer une instance existente.
si tu as pas trouvé d'instance, fais un CreateObject. Place alors un flag qui t'indiquera qu'il te faut détruire l'instance de Word