Имеется вот такая USB-реле с китайского сайта. Долго валялась без дела, а теперь загорелся написать VB код для управления этой релюшкой. Назначение реле может быть разное, это не суть важно. Главное, подружить библиотеку на C++ вместе с VB.
Есть архив с готовой библиотекой и примером. Есть похожая тема, где люди попытались сделать код на VB6, но во первых код до конца не написан, во вторых, то что там есть не работает.
Я попытался из среды VB6 подключить библиотеку. Стандартно ссылку на dll не получилось сделать. Тогда я прописал путь к dll при объявлении функций.
Производитель этих реле описывает работу следующим образом:
- 1. Инициализируем библиотеку call usb_relay_init().
2. Получаем список подключенных к ПК USB-модулей реле usb_relay_device_enumerate().
3. Открываем устройство usb_relay_device_open().
4. А дальше уже непосредственно управляем релюшками.
- usb_relay_device_open_one_relay_channel()
usb_relay_device_open_all_relay_channel()
usb_relay_device_close_one_relay_channel()
usb_relay_device_close_all_relay_channel()
Первый два этапа проходят нормально. usb_relay_device_enumerate дает некий идентификатор, по которому я через CopyMemory получаю структуру
- Код: Выделить всё
Public Type USB_Relay_Device_Info
Serial_Number As Long
Device_Path As Long
Type As Long
Next As Long
End Type
В данном случае Serial_Number, тоже указатель. Через функцию CopyMemoryToString, я получаю строку из 5 символов в виде иероглифов, хотя должна получится нормальная строка "WRO0H"
Далее нужно открыть устройство, как раз на этом этапе возникает ошибка. "Ошибка 49. Неверный вызов DLL"
Вот эта функция, и как я ее вызываю:
- Код: Выделить всё
Public Enum USB_Relay_Device_Type
USB_RELAY_DEVICE_ONE_CHANNEL = 1
USB_RELAY_DEVICE_TWO_CHANNEL = 2
USB_RELAY_DEVICE_FOUR_CHANNEL = 4
USB_RELAY_DEVICE_EIGHT_CHANNEL = 8
End Enum
Public Type USB_Relay_Device_Info
Serial_Number As Long
Device_Path As Long
Type As Long
Next As Long
End Type
Public Declare Function usb_relay_init Lib "c:\!tmp1\MyVBRelay\usb_relay_device.dll" () As Long
Public Declare Function usb_relay_exit Lib "c:\!tmp1\MyVBRelay\usb_relay_device.dll" () As Long
Public Declare Function usb_relay_device_enumerate Lib "c:\!tmp1\MyVBRelay\usb_relay_device.dll" () As Long
Public Declare Function usb_relay_device_open Lib "c:\!tmp1\MyVBRelay\usb_relay_device.dll" (ByRef Device_Info As USB_Relay_Device_Info) As Long
Private Sub main()
mUSBRelay.usb_relay_init
Dim n As Long
n = mUSBRelay.usb_relay_device_enumerate
Dim t As USB_Relay_Device_Info
Win32.CopyMemory ByVal VarPtr(t), ByVal n, Len(t)
Dim z As Long
z = usb_relay_device_open(t)
End Sub
Понимаю что без железяки будет сложно что то проверить/подсказать. Но если кто нибудь откликнется, буду очень признателен.