VB6 Subscript Out для Range - но это странно, потому что зеркальная функция работает нормально - PullRequest
1 голос
/ 09 января 2020

Спасибо за чтение.

Я создал библиотеку VB6 DLL (VB_InterFace только для имени), которая взаимодействует с C# DLL (C # _Driver только для имени), которая взаимодействует с устройством Bluetooth.

Демонстрационное тестовое приложение VB6 (VB_Demo только для имени), созданное на первом этапе, работает нормально, делает то, что должно. Он вызывает VB_Interface и открывает и закрывает BTDevice. Дополнительные функции также работают нормально.

Однако при помещении операционного кода из VB_Interface в другую библиотеку DLL, которая является библиотекой динамических операций, Open работает нормально, но Close выдает ошибку. «Переменная не определена» при возврате из C # _Driver.

Я просто не понимаю, почему, код такой же, процесс только незначительно отличается. Я имею в виду это;

В VB_Demo у меня есть две кнопки «Открыть», «Закрыть», и когда я нажимаю на них, я получаю ожидаемую от BTDevice обратную связь.

Private Sub btnOpenPort_Click()

'MsgBox steps(0)
    ReDim steps(5)

    Dim rc As HF4000_ResultCodes
    'rc = driver.OpenSerial(cmbPorts.Text)

    If driver.OpenSerial(cmbPorts.Text) = True Then


Private Sub btnClosePort_Click()

    Dim rc As HF4000_ResultCodes

    If driver.CloseSerial("COM4") = True Then

Однако в живой DLL он просто выполняет те же функции внутри себя, не будучи инициированным нажатием кнопки.

' See IScanDevice documentation.
' @see IScanDevice#OpenDevice
Private Function IScanDevice_OpenDevice() As Scanning.Scan_ResultCodes
          (truncated slightly)
50      If driver.OpenSerial("COM4") = True Then
            rc = READY
            MsgBox "Connected to the device successfully."


' See IScanDevice documentation.
' @see IScanDevice#CloseDevice
Private Function IScanDevice_CloseDevice() As Scanning.Scan_ResultCodes
            (truncated slightly)
50        If driver.CloseSerial("COM4") = True Then
60          rc = READY
70          IScanDevice_CloseDevice = Scan_Success

clsDriver.cls

Public Event OnStateChanged(newState As String)

Public Event OnDataUpdated()

Dim WithEvents CSharpInteropServiceEvents As CSharpInteropService.LibraryInvoke
Dim load As New LibraryInvoke


Private Sub Class_Initialize()
  Set CSharpInteropServiceEvents = load
End Sub

Private Sub CSharpInteropServiceEvents_MessageEvent(ByVal newState As String)

   If newState = "OpenForm1" Then
   '   FormDummy2.Show  ' Not required
   End If

  If State <> newState Then
    State = newState
    RaiseEvent OnStateChanged(State)
    GetDriverData
  End If

End Sub

Private Function BluetoothTestInvoke(load, functionName, param)
    BluetoothTestInvoke = load.GenericInvoke("BluetoothTest.dll", "BluetoothTest.Class1", functionName, param)
End Function

Function OpenSerial(portNumber)   '   "COM4"
  Dim param(0) As Variant
  Dim retorno As Variant

  param(0) = portNumber
  retorno = BluetoothTestInvoke(load, "OpenSerial", param)

  OpenSerial = retorno(0)    <<<<<<<  Works fine returns TRUE

End Function

Function CloseSerial(portNumber)   '   "COM4"
  Dim param(0) As Variant
  Dim retorno As Variant

  param(0) = portNumber
  retorno = BluetoothTestInvoke(load, "CloseSerial", param)

  CloseSerial = retorno(0)    <<<<<<<<< "Error Subscript Out of Range"

End Function

Я обнаружил, что это - и я думаю, что это причина, почему не работает Close. Вопрос в том, почему возникает такая ситуация ...

Когда выполняется driver.OpenSerial, он нажимает> функцию OpenSerial. Внутри функции OpenSerial он выполняет BluetoothTestInvoke, где «load» - это «CSharpInteropService.LibraryInvoke». Оттуда он перемещается в - Sub CSharpInteropServiceEvents_MessageEvent

.. и все в порядке.

Однако, когда я затем запускаю driver.CloseSerial, после этого он нажимает> Функция CloseSerial. Внутри функции OpenSerial он выполняет BluetoothTestInvoke, где «load» - это «CSharpInteropService.LibraryInvoke»

Теперь вот оно «следует» перейти к - Sub CSharpInteropServiceEvents_MessageEvent

Однако нет, он просто переходит на следующую строку, которая CloseSerial = retorno (0)

, и именно здесь я получаю ошибку «Subscript out of range» для retorno (0)

По какой-то причине в CloseSerial не вызывается «load» BluetoothTestInvoke (load, «CloseSerial», param)

Мысли и предложения приветствуются.

ОБНОВЛЕНИЕ

Совершенно верно, никогда не следует ничего предполагать.

По советам я начал копать глубже в библиотеку C#. Оказывается, значение «param», которое означает, что порт Bluetooth передается в вызов CloseSerial, а оттуда передается во внешней библиотеке C# библиотеки dll. На одном этапе он сбрасывается, поэтому номер порта, который должен обрабатываться, теряется, поэтому он не закрывается, а именно «ожидаемые» данные не были возвращены вызывающему приложению.

  param(0) = portNumber
  retorno = BluetoothTestInvoke(load, "CloseSerial", param)   <<  param was being reset in the external library. 

1 Ответ

0 голосов
/ 20 января 2020

См. Мое ОБНОВЛЕНИЕ в первоначальном вопросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...