|
Gordon Prince
Guest
|
I'm getting occasional errors thrown pointing to this procedure. It doesn't happen very often, and I can't reproduce it in my development environment. But looking at the code
Private Sub AdxOutlookAppEvents1_ExplorerActivate(sender As Object, explorer As Object) Handles _
AdxOutlookAppEvents1.ExplorerActivate, _
AdxOutlookAppEvents1.ExplorerSelectionChange
Dim myExplorer As Outlook.Explorer = TryCast(explorer, Outlook.Explorer)
If myExplorer Is Nothing Then Return
Dim sel As Outlook.Selection = Nothing
Dim item As Object = Nothing
Try
sel = myExplorer.Selection
Catch
End Try
If sel Is Nothing Then Return
Try
If sel.Count = 1 Then
item = sel.Item(1)
If itemEvents.IsConnected Then itemEvents.RemoveConnection()
itemEvents.ConnectTo(item, True)
End If
Catch ex As Exception
Finally
If sel IsNot Nothing Then Marshal.ReleaseComObject(sel) : sel = Nothing
End Try
End Sub
I'm wondering if this isn't better practice (to RemoveConnection regardless of whether ConnectTo is called):
Try
If itemEvents.IsConnected Then itemEvents.RemoveConnection()
If sel.Count = 1 Then
item = sel.Item(1)
itemEvents.ConnectTo(item, True)
End If
Catch ex As Exception
Any thoughts? |
|
Posted 24 Nov, 2015 17:09:27
|
|
Top
|
|
Andrei Smolin
Add-in Express team
Posts: 18793
Joined: 2006-05-11
|
Hello Gordon,
Gordon Prince writes:
I'm wondering if this isn't better practice (to RemoveConnection regardless of whether ConnectTo is called):
This variant looks more correct to me.
Andrei Smolin
Add-in Express Team Leader |
|
Posted 25 Nov, 2015 02:57:51
|
|
Top
|
|
Gordon Prince
Guest
|
Here's the error the user is getting in production. It's quite intermittent, and I can't reproduce it either on the production computer or my development computer. But at least two of my users get it sometimes, so I'd like to fix it.
Exception Source: GKBMOutlook
Exception Type: System.Runtime.InteropServices.InvalidComObjectException
Exception Message: COM object that has been separated from its underlying RCW cannot be used.
Exception Target Site: AdxOutlookAppEvents1_ExplorerActivate
---- Stack Trace ----
GKBMOutlook.AddinModule.AdxOutlookAppEvents1_ExplorerActivate(sender As Object, explorer As Object)
GKBMOutlook.DLL: N 0001 (0x1) IL
AddinExpress.MSO.ADXOutlookAppEvents.DoExplorerSelectionChange(explorer As Object)
GKBMOutlook.DLL: N 0017 (0x11) IL
...
Exception Source:
Exception Type: AddinExpress.MSO.ADXExternalException
Exception Message: An error has occurred in the code of the add-in.
Exception Target Site: Object reference not set to an instance of an object.
I'm wondering about this code for the procedure:
Private Sub AdxOutlookAppEvents1_ExplorerActivate(sender As Object, explorer As Object) Handles _
AdxOutlookAppEvents1.ExplorerActivate, _
AdxOutlookAppEvents1.ExplorerSelectionChange
Dim myExplorer As Outlook.Explorer = Nothing
Try
myExplorer = explorer
Catch ex As Exception
End Try
If myExplorer Is Nothing Then Return
Dim sel As Outlook.Selection = Nothing
Try
sel = myExplorer.Selection
Catch ex As Exception
End Try
If sel Is Nothing Then Return
Dim item As Object = Nothing
Try
If itemEvents.IsConnected Then itemEvents.RemoveConnection()
If sel.Count = 1 Then
item = sel.Item(1)
itemEvents.ConnectTo(item, True)
End If
Catch ex As Exception
Finally
If sel IsNot Nothing Then Marshal.ReleaseComObject(sel) : sel = Nothing
End Try
End Sub
I can't figure out what could be throwing the error. Any ideas?
Also, after contemplating this closely, I wonder if theIf itemEvents.IsConnected Then itemEvents.RemoveConnection() statement wouldn't be better at the top of the procedure. Any thoughts on that modification?
Thanks. |
|
Posted 25 Nov, 2015 05:59:44
|
|
Top
|
|
Gordon Prince
Guest
|
My original code was:
Dim myExplorer As Outlook.Explorer = TryCast(explorer, Outlook.Explorer)
Is that more likely to throw the error than the code I've posted with the separate
Dim var = nothing
var = something
if var is nothing
Thanks. |
|
Posted 25 Nov, 2015 06:05:42
|
|
Top
|
|
Andrei Smolin
Add-in Express team
Posts: 18793
Joined: 2006-05-11
|
Gordon Prince writes:
COM object that has been separated from its underlying RCW cannot be used.
This occurs when you use a variable that you previously released using Marshal.ReleaseComObject(). I strongly recommend that you pay attention to all arguments of Add-in Express events: you must not release them. Note that assigning such an argument to a variable (myExplorer = explorer in your code above) does NOT create another COM object; instead both variable now refer to the same COM object and releasing one of them will release the other one.
Andrei Smolin
Add-in Express Team Leader |
|
Posted 25 Nov, 2015 07:03:29
|
|
Top
|
|
Gordon Prince
Guest
|
I can't believe it, but I went back through my code and found two objects that Add-in Express passed in to procedures that I released. I've removed those two release statements per your suggestion.
Often it's the basics, eh? |
|
Posted 25 Nov, 2015 07:29:41
|
|
Top
|
|
Andrei Smolin
Add-in Express team
Posts: 18793
Joined: 2006-05-11
|
Such thing happen.
Andrei Smolin
Add-in Express Team Leader |
|
Posted 25 Nov, 2015 07:39:04
|
|
Top
|
|