gpt4 book ai didi

vb.net - 在形状集合中混淆索引越界

转载 作者:行者123 更新时间:2023-12-02 04:24:08 26 4
gpt4 key购买 nike

我正在尝试修复某些使用 MS Office Interop 库的 VB NET 代码中的不一致问题。使用相同的文件和数据运行,以下代码抛出此异常:

The index into the specified collection is out of bounds.
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext()
at myProject.TableNotePages(clsUsrDoc& usrdoc) in path\file.vb:line 1454
...

第 1454 行是 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

有几个问题可以帮助我解决这个问题:

  1. 为什么不是每次都这样?
  2. 跟踪中的框架 moveNext 方法是否在循环的最后一个非条件行而不是在“for each”或“next”行上调用(在 iShp += 1 和 End If 之间添加另一行会导致它而不是在那条线上失败)?
  3. VB foreach 循环(我的专长是 C/Java)或互操作集合是否有什么不寻常之处会导致它尝试迭代超出形状集合的末尾?

任何对这里可能发生的事情的见解都将受到赞赏。

最佳答案

似乎偶尔 vb/word 互操作会任意地离开形状集合的末尾。下面的代码将“for each”替换为“for x to y”,已在一些环境中成功运行了具有统计意义的次数(大约 50 次)。我知道这不是一个好的答案,并且仍然没有回答为什么会发生这种情况的问题,但确实解决了问题,因此作为答案发布以防示例对其他人有帮助:

    Dim MyDoc As Word.Document = usrdoc.Document
Dim NoteBoxes As New Collections.Generic.SortedDictionary(Of Integer, Word.TextFrame)
Dim iShp As Integer = 1
Dim loopLength As Integer = MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes.Count
Dim shp As Word.Shape = Nothing
For i As Integer = 1 To loopLength '1-indexed
shp = MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes(i)
If Not shp.TextFrame.Next Is Nothing Then
NoteBoxes.Add(iShp, shp.TextFrame)
iShp += 1
End If
Next

关于vb.net - 在形状集合中混淆索引越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56482054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com