2017-07-07 106 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

相關問題