|
|
||||||||||||||||
Передача массива байт в .dll31.12.2019, 21:53. Показов 7030. Ответов 75
Метки нет (Все метки)
Никак не пойму каким образом правильно передать массив байт в библиотеку на С++ из программы на VB 6.0.
Код модуля:
Судя по всему, я передаю адрес массива. Видимо, надо его преобразовать.
0
|
||||||||||||||||
| 31.12.2019, 21:53 | |
|
Ответы с готовыми решениями:
75
Передача массива через write: Передается только 8 байт Загрузка неуправляемой Dll из массива байт передача массива байт, протокл |
|
|
|
| 05.01.2020, 14:00 [ТС] | |
|
Croessmah, сейчас всё заработало. Только CRC_16 не соответствует.
При передаче строки 2, 3, 7, 0, 0, 3 должен получить 048С, а получаю 09А0. Ошибка была в том, что передавал Lengt числом. Сделал, как в примере DrOffset и "процесс пошёл". Обычная невнимательность. Неделя за компом может прилично отбить мозг.
0
|
|
|
Модератор
|
||
| 05.01.2020, 14:54 | ||
|
Argus19, мб сначала разобраться с типами, способами передачей параметров в VB6?
В VB6 типы строк - BSTR. Все работа со строками в VB6 ведется в юникоде. При декларировании функции из DLL если нужно чтобы строки передавались как ANSI, то нужно параметр определять как ByVal As String (либо в библиотеке типов как LPSTR). В данном случае VB6 автоматом выполнить перевод строки из UNICODE в ANSI. Если необходимо передавать юникод то необходимо определять параметр как ByVal As Long и передавать как StrPtr(строка) (для библиотеки типов просто либо LPWSTR либо BSTR). Альтернативно можно задекларировать параметр как ByRef As Any и передавать как хочешь либо ByVal СТРОКА либо ByVal StrPtr(СТРОКА), также останется возможность передавать любые данные. Для ручного перевода строк из UNICODE в ANSI (и обратно) существует функция StrConv. Добавлено через 9 минут Мало того что unsigned тип в vb6 только один - это BYTE, так int - это вообще-то Long.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||||||
| 05.01.2020, 16:37 | ||||||||||||||||
|
The trick, автору ведь не нужна работа со строками. Ему нужно посчитать контрольную сумму от последовательности байт. С этой точки зрения все равно, строка там или что еще, главное, чтобы был правильный указатель на начало последовательности и ее размер.
Однако учитывая, что строка в VB действительно юникодная (а точнее - UTF16), то байт приходит в функцию на С++ в два раза больше, чем автор написал символов. Argus19, т.е. на стороне С++, когда вы передаете строку "237003", на самом деле получается такая последовательность
Если нужен именно второй вариант, то на стороне VB можно сделать так:
1
|
||||||||||||||||
|
|
||||||||
| 05.01.2020, 16:50 [ТС] | ||||||||
0
|
||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 05.01.2020, 16:52 | |
|
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 05.01.2020, 17:18 | ||||
|
Добавлено через 4 минуты -48 - это 208 в беззнаковом представлении. Иными словами, все именно так, я как я описывал, а вы сами сделали число 208 путем нехитрых манипуляций. Добавлено через 7 минут Argus19, т.е. тут скорее вопрос к вам, нафига вы отнимаете 48 от значений байтов, которые вам пришли в функцию? Добавлено через 1 минуту Вот наглядная демонстрация работы: https://rextester.com/QWETNX89062 Обе ваши заявленные контрольные суммы
1
|
||||
|
Модератор
|
|||
| 05.01.2020, 17:35 | |||
|
Добавлено через 44 секунды
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 05.01.2020, 17:49 | ||
|
The trick, традиционно функция расчета CRC не принимает строку, она принимает указатель на последовательность байт. Что за последовательностью стоит - строка или что-то еще, дело десятое.
Добавлено через 9 минут Просто я хотел обратить внимание, что в изначальной постановке о непосредственно строках не шла речь. Автор с самого начала передавал туда массив байт. И если ему, предположим, нужно посчитать CRC от юникодной строки, то того кода было бы достаточно. Мы просто рассматриваем строку как массив байт и считаем. Алгоритму CRC все равно, два там байта на символ или один, или четыре. Поэтому я и сказал, что автору не нужна работа со строками, но конечно же ему нужно понимать как правильно передать такую строку, чтобы можно было поработать с последовательностью байт из которых она состоит.
1
|
||
|
Модератор
|
||||||||
| 05.01.2020, 19:07 | ||||||||
1
|
||||||||
|
|
|
| 05.01.2020, 19:32 [ТС] | |
|
DrOffset, The trick, большое спасибо за помощь. Сравнил со скриншотом работы ОРС сервера. Всё получилось.
Виноват я. Хотел соблюсти передачу данных так же, как в VB, чтобы сравнить результат.
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||
| 05.01.2020, 19:50 | ||||
|
Почему бы ему не хотеть посчитать контрольную сумму от юникода? Явно об этом нигде не говорилось. Добавлено через 4 минуты
0
|
||||
|
Модератор
|
||||||
| 05.01.2020, 20:07 | ||||||
|
0
|
||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||
| 05.01.2020, 20:23 | |||||
|
А с тем, что нужно понимать как передавать данные из VB - я и не спорил. Я же сам ему объяснял про это выше и про связь с юникодом.
0
|
|||||
|
|
|
| 05.01.2020, 20:34 [ТС] | |
|
The trick, DrOffset, из .dll можно получить только одно значение, что осложняет её разработку.
В посте №48 ссылка на код консольного приложения. Возможно ли передавать строки или массивы из VB 6.0 в консольное приложение на С++? Если да, то разработка .dll может упроститься, т.к. можно выводить промежуточные результаты. Не только я, а, скорее всего, просто начинающие не знают о взаимодействии VB и С++. Прекрасная тема для статьи .
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 05.01.2020, 20:36 | |
|
The trick, Короче, наш разговор на самом деле не очень полезен для темы.
Я просто скажу, что к тому, что вы говорили здесь по сути, у меня нет никаких претензий. Мое цитирование вас было сделано лишь для того, чтобы было понятно в каком контексте я собираюсь продолжать тему и связано это с допущением возможности, что получившийся массив байт из юникодной строки - это именно то, что нужно было ТС, а он сам просто еще не понял так это или нет. Дополнительно к этому, я хотел предостеречь ТС от восприятия этой задачи, как задачи работы со строками (к этому меня подвигло неожиданное использование им std::string в контексте, где оно не только не нужно, но и вредно), тогда как работа со строками здесь является только побочным эффектом и заканчивается на стороне VB.
1
|
|
|
|
||
| 05.01.2020, 20:47 [ТС] | ||
|
Не на всяком предприятии нужна SCADA, часто достаточно автоматизировать только сбор данных. Покупать SCADA чтобы использовать только часть её функций "жаба задушит". Проще написать свою программу. На VB 6.0 всё нормально пишется и работает. Я написал с использованием MSComm, затем перешёл на использование Win32API, что решило проблему переносимости. .dll на С++ прекрасно используются в VB и других ЯП. Задумка в написании библиотеки на С++ для реализации протокола Modbus RTU, чтобы можно было её использовать из других ЯП.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||
| 05.01.2020, 20:51 | ||||||||
|
Сложность организации этого взаимодействия превосходит сложность вашей задачи в целом. Кусочек кода DLL:
1
|
||||||||
|
Неэпический
|
|
| 05.01.2020, 20:53 | |
|
1
|
|
| 05.01.2020, 20:53 | |
|
Передача массива в dll
Передача массива из DLL в основную программу
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
начало и оглавление
-
Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|