2017-07-07 110 views
0

我将一个arcobjects地图事件挂钩到vb.net表单以侦听地图选择更改。这一切都正常,但用户在打开表单时偶尔报告这个错误。我看不到任何模式来重现错误,它似乎是随机的。“已与其基础RCW分离的COM对象无法使用”与vb.net表单事件相关的错误

“已从与其基础RCW分开COM对象不能使用”

它从表单负载起源()方法,其中,我挂钩事件。

任何人都可以帮助我了解我做错了什么吗?我正在解决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 

回答

0

好吧,我想我已经通过使用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 
1

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

+0

我已经采取了这种方法,但不幸的是问题仍然存在。我的表单也与文档事件挂钩,因此在文档更改时从未打开。每当地图文档发生变化时,用户都必须重新加载表单,所以FormLoad()总是为新文档重新创建处理程序。我怀疑它与更改地图文档有关,所以我会稍微深入一点。 – Courlu

+0

任何你使用'Marshal'或'ComReleaser'处理资源的机会? – Jumpercables

+0

不,我只处理搜索游标,但没有涉及此表单或事件。 – Courlu

相关问题