es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

BluetoothLEDevice.FromIdAsync devuelve un objeto __ComObject no convertible.

Antes de comenzar, quiero mencionar que, al investigar este problema, he revisado decenas de publicaciones aquí y en otros lugares, y soy consciente de que VB es lo peor para la programación Bluetooth. Sin embargo, esto es para un cliente que tiene un gran sistema heredado en VB y no tengo opción.

Según la documentación de MS, se supone que el método BluetoothLEDevice.FromIdAsync devuelve un objeto BluetoothLEDevice, pero en mi sistema devuelve un System.__ComObject genérico al que no puedo convertir en un BluetoothLEDevice. He intentado usar Cast y DirectCast pero ninguno funciona. El código de muestra en C++ que he revisado no requiere ningún tipo de conversión; la variable se declara y se inicializa utilizando la función BluetoothLEDevice.FromIdAsync sin problemas.

Aquí está mi código de prueba.

Private Sub ConnectToDevice(di As DeviceInformation)
    ' di.id = "BluetoothLE#BluetoothLE48:5f:99:3c:fd:36-84:2e:14:26:9e:7b"
    Debug.Print("Conectando con " & di.Name & " a las " & Now.ToShortTimeString)
    Dim genericObject As Object
    Dim myDevice As BluetoothLEDevice
    Try
        genericObject = BluetoothLEDevice.FromIdAsync(di.Id)
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
    If Not IsNothing(genericObject) Then Debug.Print("El uso de 'Object' devuelve " & genericObject.ToString)
    Try
        myDevice = BluetoothLEDevice.FromIdAsync(di.Id)
    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
End Sub

Y aquí está el resultado:

Conectando con TM-2021090161 a las 2:08 PM
El uso de 'Object' devuelve System.__ComObject
Se produjo una excepción: 'System.InvalidCastException' en testBTLE.exe
No se puede convertir un objeto del tipo 'System.__ComObject' al tipo 'Windows.Devices.Bluetooth.BluetoothLEDevice'.

Y una captura de pantalla del genericObject devuelto:
Watch Window - Generic ComObject

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema que enfrenta el usuario está relacionado con el tipo de retorno de la función BluetoothLEDevice.FromIdAsync. La documentación indica que esta función debe devolver un objeto BluetoothLEDevice, pero en el sistema del usuario está devolviendo un objeto genérico System.__ComObject que no se puede convertir a un objeto BluetoothLEDevice. El usuario ha intentado utilizar Cast y DirectCast sin éxito.

    El usuario ha investigado varias publicaciones y ha descubierto que VB.net no es adecuado para la programación Bluetooth. Sin embargo, tienen un cliente con un sistema VB heredado y no tienen otra opción más que utilizarlo.

    El usuario ha proporcionado su código de prueba y la salida generada. La salida muestra que el primer intento de conectarse al dispositivo Bluetooth utilizando la función FromIdAsync devuelve un objeto genérico System.__ComObject. El segundo intento de asignar el valor devuelto a un objeto BluetoothLEDevice falla con una excepción InvalidCastException.

    Según la información proporcionada, parece que el problema es más probable que sea causado por un problema con el stack de Bluetooth en el sistema del usuario. Esto podría ser debido a controladores desactualizados, hardware incompatible u otros problemas. El usuario debería intentar actualizar sus controladores y revisar los requisitos del sistema para dispositivos Bluetooth de baja energía para asegurarse de que su hardware sea compatible.

    Si el problema persiste, el usuario puede considerar utilizar un lenguaje de programación o un marco de trabajo diferente para la programación Bluetooth. Si bien es posible encontrar soluciones alternativas en VB.net, podría ser más problemático a largo plazo.

Comments are closed.