Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;无法使用已与其基础RCW分离的COM对象";与vb.net窗体事件相关的错误_Vb.net_Events_Com_Arcobjects_Rcw - Fatal编程技术网

&引用;无法使用已与其基础RCW分离的COM对象";与vb.net窗体事件相关的错误

&引用;无法使用已与其基础RCW分离的COM对象";与vb.net窗体事件相关的错误,vb.net,events,com,arcobjects,rcw,Vb.net,Events,Com,Arcobjects,Rcw,我正在将arcobjects映射事件挂接到vb.net窗体,以侦听映射选择的更改。这一切都很好,但用户在打开表单时偶尔会报告此错误。我看不到任何模式来重现错误,它似乎是随机的 “无法使用与其基础RCW分离的COM对象” 它源于我挂接事件的表单Load()方法 谁能帮我理解我做错了什么?我正在FormClosing()事件中取消映射选择事件的挂钩,我认为这是正确的方法 Public Class MyForm Private _activeViewEvents As IActiveView

我正在将arcobjects映射事件挂接到vb.net窗体,以侦听映射选择的更改。这一切都很好,但用户在打开表单时偶尔会报告此错误。我看不到任何模式来重现错误,它似乎是随机的

“无法使用与其基础RCW分离的COM对象”

它源于我挂接事件的表单Load()方法

谁能帮我理解我做错了什么?我正在FormClosing()事件中取消映射选择事件的挂钩,我认为这是正确的方法

Public Class MyForm

    Private _activeViewEvents As IActiveViewEvents_Event

    Private Sub FormLoad(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _activeViewEvents = TryCast(pMxDoc.ActiveView.FocusMap, IActiveViewEvents_Event)
        AddHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged    
    End Sub

    Private Sub SelectionChanged
        'do something when selection is changed
    End Sub

    Private Sub FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        RemoveHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged
    End Sub

End Class

创建和销毁处理程序的方法是有效的。当表单打开时更改地图文档时,您可能会收到RCW COM异常。由于您正在使用
FocusMap
创建句柄,因此当文档更改时,
FocusMap
也会更改,这意味着您需要为新的映射文档重新创建句柄。

好,所以我想我已经通过使用ActiveViewChanged事件解决了这个问题。我没有在每次表单加载或新文档事件时重新定位事件,而是尝试侦听ActiveViewChanged事件何时被触发,并每次重新定位SelectionChanged事件。事实证明,每次打开新文档时都会多次触发此操作(不确定原因)。无论如何,问题似乎已经过去了。下面是一些示例代码:

Public Class MyForm

Private _activeViewEvents As IActiveViewEvents_Event
Private _docEvents As IDocumentEvents_Event

Private Sub FormLoad(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AddHandler _docEvents.ActiveViewChanged, AddressOf ActiveViewChanged
End Sub

Private Sub ActiveViewChanged()
    Dim maps = pMxDoc.Maps
    For i = 0 to maps.Count - 1 'remove handlers from all maps
        RemoveActiveViewEvents(maps.Item(i))
    Next
    SetupActiveViewEvent(pMxDoc.ActiveView.FocusMap) 'only add handler to active map
End Sub

Private Sub RemoveActiveViewEvents(map As IMap)
    _activeViewEvents = CType(map, IActiveViewEvents_Event)
    RemoveHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged
End Sub

Private Sub SetupActiveViewEvents(map As IMap)
    _activeViewEvents = CType(map, IActiveViewEvents_Event)
    AddHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged
End Sub

Private Sub SelectionChanged
    'do something when selection is changed
End Sub

End Class

我已经采取了这种方法,但不幸的是,问题依然存在。我的表单还与文档事件挂钩,因此在文档更改时,它永远不会保持打开状态。每当映射文档发生更改时,用户必须重新加载表单,因此FormLoad()总是为新文档重新创建处理程序。我怀疑它与更改地图文档有关,因此我将深入研究它。是否有可能您正在使用
封送
ComReleaser
处理资源?不,我只处理搜索游标,但与此表单或事件无关。现在通过收听ActiveViewChanged事件修复。解决方案张贴。