Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Plantage étrange à la fermeture doc basé sur un dot

9 réponses
Avatar
natric
[Posted to microsoft.public.fr.word, copy sent to author]

Bonjour à tous,

J'ai un problème de plantage à la fermeture d'un document (essai.doc)
attaché à un modèle (base.dot). Pour vous expliquer ça, j'ai créer deux
fichiers minimum qui reproduisent le problème. En voici une description
:

- essai.doc est un document vide, simplement attaché à base.dot.

- base.dot contient juste une liste déroulante vide ds le document même
et un peu de code :

.dans ThisDocument :

Private Sub Document_Open()
DocOpenHelper
End Sub

Private Sub Document_Close()
'n'importe quel contenu
End Sub

.dans un module nommé Module1:

Function DocOpenHelper()
If ActiveDocument.Name = "base.dot" Then
MsgBox "Pas un doc"
End If
End Function

Voilà, avec ça, quand j'ouvre, puis ferme base.dot, tout est ok. Mais si
j'ouvre essai.doc, puis tente de le fermer, j'obtiens immédiatement et
de manière constante un crash de winword.exe (Word 97 SR2 sous Win2K Pro
FR SP4) avec l'erreur "L'instruction à '0x651ff21a' emploie l'adresse
mémoire '0x0000002c'. La mémoire ne peut pas être 'read'.

Si je supprime au moins un des private sub de ThisDocument OU supprime
la seule fonction de Module1 OU retire la liste déroulante de
l'interface, par magie, ça ne plante plus du tout.

Si je change le contenu de DocOpenHelper() par quelque chose de bidon
comme "x=1", ça marche aussi. Si par contre, je change par un truc plus
réduit qu'à l'origine mais accédant tout de même à quelque chose de Word
comme "MsgBox ActiveDocument.AttachedTemplate.Name", ça continue de
planter en sortie (jamais en entrée).

Alors, sachant que je ne peux pas me passer d'aucun des éléments
présents (events handlers, fct helper, combo-box), j'aimerais identifier
ce qui pose problème dans DocOpenHelper pour voir à contourner le
plantage.

Ce qui me perturbe est aussi qu'un code exécuté à l'ouverture génère un
plantage à la fermeture d'essai.doc, et ceci même si Document_Close()
est vide (vide pour réduire le cas au mini des minis qui continue de
planter).

Voilà ! Est-ce que ça vous inspire quelque chose ? Je peux envoyer ces
deux fichiers (un zip de 34Ko) à qui veut essayer sous Word 97 (sais pas
pour les autres versions) bien sûr.

Arghhhh!

9 réponses

Avatar
Anacoluthe
Bonjour !

Vous confondez les événements d'ouverture et fermeture du modèle
avec ceux d'ouverture et fermeture du document...... ;-)

Anacoluthe
« Tout est difficile avant d'être simple. »
- Thomas FULLER



'natric' nous a écrit ...
[Posted to microsoft.public.fr.word, copy sent to author]

Bonjour à tous,

J'ai un problème de plantage à la fermeture d'un document (essai.doc)
attaché à un modèle (base.dot). Pour vous expliquer ça, j'ai créer deux
fichiers minimum qui reproduisent le problème. En voici une description
:

- essai.doc est un document vide, simplement attaché à base.dot.

- base.dot contient juste une liste déroulante vide ds le document même
et un peu de code :

.dans ThisDocument :

Private Sub Document_Open()
DocOpenHelper
End Sub

Private Sub Document_Close()
'n'importe quel contenu
End Sub

.dans un module nommé Module1:

Function DocOpenHelper()
If ActiveDocument.Name = "base.dot" Then
MsgBox "Pas un doc"
End If
End Function

Voilà, avec ça, quand j'ouvre, puis ferme base.dot, tout est ok. Mais si
j'ouvre essai.doc, puis tente de le fermer, j'obtiens immédiatement et
de manière constante un crash de winword.exe (Word 97 SR2 sous Win2K Pro
FR SP4) avec l'erreur "L'instruction à '0x651ff21a' emploie l'adresse
mémoire '0x0000002c'. La mémoire ne peut pas être 'read'.

Si je supprime au moins un des private sub de ThisDocument OU supprime
la seule fonction de Module1 OU retire la liste déroulante de
l'interface, par magie, ça ne plante plus du tout.

Si je change le contenu de DocOpenHelper() par quelque chose de bidon
comme "x=1", ça marche aussi. Si par contre, je change par un truc plus
réduit qu'à l'origine mais accédant tout de même à quelque chose de Word
comme "MsgBox ActiveDocument.AttachedTemplate.Name", ça continue de
planter en sortie (jamais en entrée).

Alors, sachant que je ne peux pas me passer d'aucun des éléments
présents (events handlers, fct helper, combo-box), j'aimerais identifier
ce qui pose problème dans DocOpenHelper pour voir à contourner le
plantage.

Ce qui me perturbe est aussi qu'un code exécuté à l'ouverture génère un
plantage à la fermeture d'essai.doc, et ceci même si Document_Close()
est vide (vide pour réduire le cas au mini des minis qui continue de
planter).

Voilà ! Est-ce que ça vous inspire quelque chose ? Je peux envoyer ces
deux fichiers (un zip de 34Ko) à qui veut essayer sous Word 97 (sais pas
pour les autres versions) bien sûr.

Arghhhh!


Avatar
natric
[Posted to microsoft.public.fr.word, copy sent to author]

In article <#,
says...
Bonjour !

Vous confondez les événements d'ouverture et fermeture du modèle
avec ceux d'ouverture et fermeture du document...... ;-)



Bon, faisons le point ;-) Soit, essai.doc attaché à base.dot avec
Document_Open() et Document_Close() dans ThisDocument de base.dot (rien
dans essai.doc).

Document_Open() s'exécute lorsqu'on ouvre base.dot ET lorsque l'on ouvre
essai.dot.

Document_Close() s'exécute lorsqu'on ferme base.dot ET lorsque l'on
ferme essai.dot.

Pour t'en convaincre, copies ça dans ThisDocument du modèle :

Private Sub Document_Open()
MsgBox "Document_Open() du .dot"
End Sub

Private Sub Document_Close()
MsgBox "Document_Close() du .dot"
End Sub

Et tu verras les deux messages à chaque fois (en ouvrant/fermant
base.dot et essai.doc)

Voilà ! Pourquoi ce plantage en sortie d'essai.doc ? Le mystère reste
entier.

Je réitère donc ma question : que faut-il changer dans DocOpenHelper()
pour que ça ne plante pas ?

Avatar
natric
[Posted to microsoft.public.fr.word, copy sent to author]

In article ,
says...
Document_Open() s'exécute lorsqu'on ouvre base.dot ET lorsque l'on ouvre
essai.dot.

Document_Close() s'exécute lorsqu'on ferme base.dot ET lorsque l'on
ferme essai.dot.




Faute de frappe dans mon précédent post : lire essai.doc bien sûr, il
n'y a pas d'essai.dot. Sorry

Avatar
Anacoluthe
Bonjour !

'natric' nous a écrit ...
Vous confondez les événements d'ouverture et fermeture du modèle
avec ceux d'ouverture et fermeture du document...... ;-)


Document_Close() s'exécute lorsqu'on ferme base.dot ET lorsque l'on
ferme essai.dot.


Ben oui, c'est ça le problème : Document_Close cause souvent des
soucis s'il est placé dans le modèle. Le code est parfois lancé
plusieurs fois avec des objets qui disparaissent, d'où plantage.
Utilisez les événements Document dans le /document/ ou des événements
Application (BeforeClose par exemple) ou des macros automatiques
(AutoClose par exemple).

Anacoluthe
« L'événement c'est comme la plomberie,
une affaire de spécialiste. »
- Daniel SCHNEIDERMANN


Avatar
natric
[Posted to microsoft.public.fr.word, copy sent to author]

In article <exZAzt#,
says...
Bonjour !

'natric' nous a écrit ...
Vous confondez les événements d'ouverture et fermeture du modèle
avec ceux d'ouverture et fermeture du document...... ;-)


Document_Close() s'exécute lorsqu'on ferme base.dot ET lorsque l'on
ferme essai.dot.


Ben oui, c'est ça le problème : Document_Close cause souvent des
soucis s'il est placé dans le modèle. Le code est parfois lancé
plusieurs fois avec des objets qui disparaissent, d'où plantage.
Utilisez les événements Document dans le /document/ ou des événements
Application (BeforeClose par exemple) ou des macros automatiques
(AutoClose par exemple).



Ah, là y a de la pensée. Merci Anacoluthe. Alors, en trois points :

1) je trouve tout de même étrange que Word ne prenne pas ça en charge et
plante bêtement (faudrait leur envoyer des codeurs Assembly et consorts
pour es guider un peu les pôvres)

2) Utiliser ds le doc : hummm, pas top pour mon cas, mais ce serait un
peu long (en gros, les macros doivent disparaitre des doc "livrés" au
final ; c'est une contrainte)

3) Le AutoClose, non (cf. un autre fil que j'ai lançé récemment ds ce
ng) car visible ds la liste user via ALT-F8.

4) BeforeClose : ça, ça me plaît. J'essaierai ça et viendrai dire le
résultat ;-)

Have a good night



Avatar
Jean-Guy Marcil
natric was telling us:
natric nous racontait que :

[Posted to microsoft.public.fr.word, copy sent to author]

In article <exZAzt#,
says...
Bonjour !

'natric' nous a écrit ...
Vous confondez les événements d'ouverture et fermeture du modèle
avec ceux d'ouverture et fermeture du document...... ;-)


Document_Close() s'exécute lorsqu'on ferme base.dot ET lorsque l'on
ferme essai.dot.


Ben oui, c'est ça le problème : Document_Close cause souvent des
soucis s'il est placé dans le modèle. Le code est parfois lancé
plusieurs fois avec des objets qui disparaissent, d'où plantage.
Utilisez les événements Document dans le /document/ ou des événements
Application (BeforeClose par exemple) ou des macros automatiques
(AutoClose par exemple).



Ah, là y a de la pensée. Merci Anacoluthe. Alors, en trois points :

1) je trouve tout de même étrange que Word ne prenne pas ça en charge
et plante bêtement (faudrait leur envoyer des codeurs Assembly et
consorts pour es guider un peu les pôvres)

2) Utiliser ds le doc : hummm, pas top pour mon cas, mais ce serait un
peu long (en gros, les macros doivent disparaitre des doc "livrés" au
final ; c'est une contrainte)

3) Le AutoClose, non (cf. un autre fil que j'ai lançé récemment ds ce
ng) car visible ds la liste user via ALT-F8.

4) BeforeClose : ça, ça me plaît. J'essaierai ça et viendrai dire le
résultat ;-)



Mais c'est beaucoup de code pour rien, peut-être, Je trouve ça bizarre ce
problème que tu as.
Si tu veux, envoie-moi ton base.dot (celui que tu mentionnes dans ton
premier message et qui faisais planté Word,) et je ferai des tests quand
j'aurai 5 mnutes.
Tu as bien dis Word 97, n'est-ce pas?

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org




Avatar
natric
[Posted to microsoft.public.fr.word, copy sent to author]

In article <ezqSco$, no-
says...
Mais c'est beaucoup de code pour rien, peut-être, Je trouve ça bizarre ce
problème que tu as.
Si tu veux, envoie-moi ton base.dot (celui que tu mentionnes dans ton
premier message et qui faisais planté Word,) et je ferai des tests quand
j'aurai 5 mnutes.
Tu as bien dis Word 97, n'est-ce pas?




Word 97 SR2 sous W2K Pro SP4 FR, oui. Je t'email ça juste après l'envoi
de ce post. Merci de te pencher sur la bête à cinq pattes, Jean-Guy.

Avatar
Jean-Guy Marcil
natric was telling us:
natric nous racontait que :

[Posted to microsoft.public.fr.word, copy sent to author]

In article <ezqSco$, no-
says...
Mais c'est beaucoup de code pour rien, peut-être, Je trouve ça
bizarre ce problème que tu as.
Si tu veux, envoie-moi ton base.dot (celui que tu mentionnes dans ton
premier message et qui faisais planté Word,) et je ferai des tests
quand j'aurai 5 mnutes.
Tu as bien dis Word 97, n'est-ce pas?




Word 97 SR2 sous W2K Pro SP4 FR, oui. Je t'email ça juste après
l'envoi de ce post. Merci de te pencher sur la bête à cinq pattes,
Jean-Guy.


Bon, J'ai fait quelques tests de mon côté.

J'ai Word 97, mais sur Win 98. Je ne crois pas que la version de Windows ait
à voir dans ce problème.

Mes résultats étaient quelque peu différents des tiens.
J'ai créé un doc à partir de ton base.dot. Ce doc plantait tout le temps,
quoique je fasse. La différence était au niveau de la combobox. Si je
l'enlevais du doc, alors il plantait à la fermeture (m¸eme après un
enregistrement). Sinon, si je gardais la combobox, mais faisais des
changements dans le code VBA de base.dot, alors il plantait à l'ouverture,
peut importe le changement (aucun changement donnait le même résultat).

AMHA, le problème se situe au niveau du combobox. Ces controles ActiveX sont
très instables et apportent presque toujours des problèmes un jour ou
l'autre dans les documents.

J'ai ouvert Word, créé un nouveau document, copié tout le code de ton
base.dot en passant par le volet explorateur de projets dans l'éditeur de
VBA et je l'ai enregistré en tant que modèle. Je n'ai pas mis de contrôle
ActiveX. Alors là, aucun problème. Jamais. Le code lui-même ne cause pas de
problème. Le fait que ton base.dot ait eu un ActiveX l'a rendu corrompu.
J'ai enleveé le combobox de ton modèle base.dot et créé un nouveau document.
Ce document plantait de la même façon que ton essai.doc. Comme tu vois, même
si le contrôle ActiveX est supprimé, la corruption qu'il a causée reste là.
Ce qui est bizarre, c'est que le base.dot lui-même n'exhibe pas ce
comportement. Mais c'est la nature des contrôle ActiveX... des résultats
bizarres. Je les évite comme la peste. Peu-être que quelqu'un s'y
connaissant dasn les contôles ActiveX viendra nous éclairer?

Donc, il semble qu'il faille que tu remplaces le ComboBox par une autre
astuce, champ MACROBUTTON, champ AutoTextList, bouton sur une barre
d'outils, champ de formulaire, etc.
Ou, tu peux re-créer ton modèle à partir d'un document vierge et espérer
que cette fois-ci le contrôle AcxtiveX n'apportera pas de corruption.

En passant, si tu crée un document basé sur un modèle, puis tu déplaces le
document ET le modèle. Alors quand tu ouvres le document, Word trouvera le
modèle si:

1) Le modèle est dans le même dossier que le doc,
2) Le modèle est dans le dossier des modèles utilisateur,
3) Le modèle est dans le dossier des modèle de groupes,
4) Le modèle est dans le même dossier qu'à l'origine (Si différent de 1 à
3),
5) Le modèle est dans le dossier des modèles de Word par Défaut (ce dossier
diffère selon la version de Word, Word 97 = Programe
FilesMicrosoftModèles.... je crois).

Si plusieurs modèles portant le même nom se trouvent dans ces dossiers, Word
prendra le premier qu'il trouve selon l'ordre que j'ai listé (Voir
http://tinyurl.com/3stqx pour une discussion à ce sujet que j'ai eu avec un
collègue MVP (en anglais). L'ordre n'est important seulement si un ordi
comporte plusieures versions du mème modèle à différents endroits). Donc tu
peux toujours envoyer un doument et son modèle et demander au récipiendaire
de les placer dans le même dossier.

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org


Avatar
natric
[Posted to microsoft.public.fr.word, copy sent to author]

Bon ! Quoique tes résultats diffèrent des miens (moi plantages toujours
à la fermeture), dans la mesure où tu mets le doigt sur un
dysfonctionnement par corruption due à l'emploi d'un ActiveX, ça devient
peu important que ça plante comme-ci ou comme-ça ;o) Glurps.

Bon, content que tu te sois penché sur le sujet. Je ne sais pas encore
si je vais tenter la reconstruction du dot from scratch OU le
contournement de l'emploi du combo (dont l'emploi ici est une sorte de
MRU liste informée à l'ouverture du dot à partir d'un fichier ini).

Ca devient plus clair... Je viendrai dire ici ce que j'aurais fait une
fois fait, histoire de finir proprement le fil.

Et pour Jean-Guy, hip hip hip...