• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2431
  • Last Modified:

Trapping a specific HResult from a COMexception in VB.net

I have a client that is getting the following error...

System.Runtime.InteropServices.COMException (0x80010002): Call was canceled by the message filter. (Exception from HRESULT: 0x80010002 (RPC_E_CALL_CANCELED))
   at System.Management.ManagementScope.Initialize()
   at System.Management.ManagementObject.Initialize(Boolean getObject)
   at System.Management.ManagementClass.GetInstances(EnumerationOptions options)
   at System.Management.ManagementClass.GetInstances()
(etc., etc.)

The error is caused by the WMI not starting up before the program that is crashing.  I plan to add a 10 sleep and try again if the error is HRESULT: 0x80010002 (RPC_E_CALL_CANCELED)...

BUT, I can't reproduce the error, so I don't know if the code If my error handling will work (or if I coded it correctly).  My since the errorCode is a 32-bit Integer, I'm not sure if I can just convert 80010002 to an int (= 2147549186) and not have to pad it.  Please let me know if the attached code snippet is correctly trapping 0x80010002

Thanks!!!!!
Private Function Identifier(ByVal wmiClass As String, ByVal wmiProperty As String) As String
        'Return a hardware identifier
        Try
            Dim Result As String = ""
            Dim mc As New System.Management.ManagementClass(wmiClass)
            Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances
            Dim mo As System.Management.ManagementObject
            For Each mo In moc
                'Only get the first one
                If Result = "" Then
                    Try
                        Result = mo(wmiProperty).ToString
                        Exit For
                    Catch ex As Exception
                        'Ignore error
                    End Try
                End If
            Next mo
 
            Return Result
        Catch ex As Runtime.InteropServices.COMException
            If ex.ErrorCode = 2147549186 Then '0x80010002
                System.Threading.Thread.Sleep(10000)
                Return Identifier(wmiClass, wmiProperty)
            End If
        End Try
        
    End Function

Open in new window

0
straubtm
Asked:
straubtm
1 Solution
 
grayeCommented:
Yeah, that works...   You can also use the "WHEN" statement.   Here is an example:
 

            Try
                ' do something here
            Catch com_ex As System.Runtime.InteropServices.COMException When com_ex.ErrorCode = &H800706BA
                MsgBox("The Remote PC is not responding.  It may be off line or" & vbCr & "firewall settings are preventing the connection", MsgBoxStyle.Exclamation, "Error")
                Exit Sub
            Catch ua_ex As System.UnauthorizedAccessException
                MsgBox("The Remote PC refused the connection.  This is most likely" & vbCr & "due to a permissions issue." & vbCr & "Note: Windows XP Home Edition cannot be configured to support remote connections", MsgBoxStyle.Exclamation, "Error")
                Exit Sub
            Catch wmi_ex As System.Management.ManagementException When wmi_ex.ErrorCode = Management.ManagementStatus.AccessDenied
                MsgBox("You do not have sufficient privileges on the remote PC" & vbCr & "This application requires Administrator rights on the Remote PC", MsgBoxStyle.Exclamation, "Error")
                Exit Sub
            Catch ex As Exception
                If IsNothing(ex.InnerException) Then
                    MsgBox("Could not get initial data" & vbCr & ex.Message, MsgBoxStyle.Critical, "Error")
                Else
                    MsgBox("Could not get initial data" & vbCr & ex.Message & vbCr & ex.InnerException.Message, MsgBoxStyle.Critical, "Error")
                End If
                Exit Sub
            End Try

Open in new window

0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now