J'essaie de résoudre un problème d'incohérence dans un code VB NET qui utilise les bibliothèques MS Office Interop. En utilisant les mêmes fichiers et données, le code suivant lance cette exception :
L'index dans le sp
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, I
at System.Runtime.InteropServices.CustomMarshalers.EnumeratorVie
at myProject.TableNotePages(clsUsrDoc& usrdoc) in path \file.vb :l
...
La ligne 1454 est la ligne iShp += 1
Dim MyDoc As Word.Document = usrdoc.Document
Dim NoteBoxes As New Collections.Generic.SortedDictionary(Of Integer, Word.TextFrame)
Dim iShp As Integer = 1
For Each shp As Word.Shape In MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes
If Not shp.TextFrame.Next Is Nothing Then
NoteBoxes.Add(iShp, shp.TextFrame)
iShp += 1
End If
Next
J'ai quelques questions qui pourraient m'aider à résoudre ce problème :
- Pourquoi cela ne se produit-il pas à chaque fois ?
- La méthode moveNext du cadre dans la trace est-elle appelée sur la dernière ligne non conditionnelle de la boucle au lieu des lignes "for each" ou "next" (l'ajout d'une autre ligne entre iShp += 1 et End If entraîne l'échec sur cette ligne) ?
- Y a-t-il quelque chose d'inhabituel dans les boucles foreach de VB (mon expertise est plutôt en C/Java) ou dans les collections interop qui ferait qu'il tenterait d'itérer au-delà de la fin de la collection de formes ?
Toute idée sur ce qui pourrait se passer ici est la bienvenue.