Спасибо за чтение.
Я создал библиотеку 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.