|
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
|
|||||||||||
С# обмен данными с DLL C++17.10.2016, 13:26. Показов 3417. Ответов 12
Метки нет (Все метки)
Здравствуйте уважаемые ГУРУ!
Функция DLL на с++ в результате работы формирует строку типа _bstr_t Эту строку нужно передать в код на С# Делаю ледующим образом: 1. На С# получаю указатель на выделенный блок памяти и передаю его параметром в функцию dll на С++ 2. В DLL создается строка с типом _bstr_t ID, которая преобразуется в массив char и записывается по адресу переданному из С#в параметре Проблема: В С# приходит не вся строка, а только "BaseBoard=" Само значение _bstr_t BaseBoard не передается. То есть передается только константная часть строки ID Если передать только переменную_bstr_t BaseBoard то выскакивает исключение что передаваемое значение не может быть NULL Хотя когда DLL функция тестируется как консольное приложение то все работает, Переменная _bstr_t ID содержит и константную часть и значение переменной _bstr_t BaseBoard. Помогите пожалуйста найти грабли. Заранее благодарен всем откликнувшимся . С#
С++:
0
|
|||||||||||
| 17.10.2016, 13:26 | |
|
Ответы с готовыми решениями:
12
Обмен данными Обмен данными |
|
[Bicycle Reinventor]
|
|||||||||||
| 17.10.2016, 13:54 | |||||||||||
|
Для примера. В DLL находится функция, принимающая строку, преобразующая её в BSTR, модифицирующая её и возвращающая обратно.
Объявление функции на стороне C++:
0
|
|||||||||||
|
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
|
||||||
| 17.10.2016, 19:53 [ТС] | ||||||
|
Exerion, спасибо за оперативный ответ.
Твой вариант рабочий и я его ранее пробовал, но он возвращает тот же результат. В моем варианте моя функция не получает аргументов (ничего преобразовывать не надо) Просто нужно возвратить _bstr_t result Видимо vtProp.bstrVal не н приводится к типу _bstr_t , хотя в окне отладки указывается BSTR Если bstr_t result сделать константой (bstr_t result = "Const"), то все прокатывает, а как переменная - то нет...
Можешь подсказать как правильно сделать преобразование? Моих мозгов не хватает. Спасибо
0
|
||||||
|
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
|
||||||
| 17.10.2016, 20:14 | ||||||
|
кусочек кода как я это делаю, может поможет
![]()
0
|
||||||
|
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
|
|
| 17.10.2016, 23:42 [ТС] | |
|
Exerion , строка
[return: MarshalAs(UnmanagedType.BStr)] в наличии
0
|
|
|
[Bicycle Reinventor]
|
|
| 18.10.2016, 09:04 | |
|
arbit, ну в вашем примере этой строки не было.
Кроме того, если вы объявляете функцию именно так, то её не нужно маршалить вручную - никаких указателей и прочей лабуды. Просто выплёвываете из c++ данные в виде BSTR или преобразуете из _bstr_t, а в c# получаете данные в виде System.String. Строчка с объявлением маршалинга именно для этого и нужна.
0
|
|
|
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
|
|||||||||||
| 22.10.2016, 20:53 [ТС] | |||||||||||
|
Простите Уважаемые ГУРУ, что отрываю от важных дел!
Уже неделю бьюсь и не могу получить нужный результат Ткните носом куда смотреть пожалуйста!!! Еще раз условие задачи: 1 Есть код рабочей функции на сайте MSDN по работе с WMI привожу в конце сообщения 2 Результат этой функции, а это строка COM тип BSTR (строчка в основном коде 168 ), нужно передать в С# Как консольное приложение - все работает. а как DLL нет Делаю следующим образом (строчка в основном коде 168): копирую vtProp.bstrVal строку в _bstr_t result ( иначе результат прибьется при очистке памяти) и возвращаю. Тип данных, возвращаемый функцией BSTR При отладке кода в С# программа вылетает без указания ошибки в строке 7 пишет что программа завершилась некорректно и будет закрыта Чувствую, что тут что-то с преобразованием типов, но вкурить не могу Помогите пожалуйста. Не дайте умереть неучем. Заранее благодарен.
0
|
|||||||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|||
| 22.10.2016, 21:17 | |||
|
У меня ваш код выдает ошибку
0
|
|||
|
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
|
|
| 22.10.2016, 21:31 [ТС] | |
|
Someone007, может у Вас не подключена библиотека "wbemuuid.lib"?
#include <comdef.h> - для работы с COM #include <Wbemidl.h> Для WMI #pragma comment(lib, "wbemuuid.lib") Данная функция как консольное приложение работает только ее нужно переименовать в main для этого Только что проверял
0
|
|
|
[Bicycle Reinventor]
|
||||||
| 22.10.2016, 21:33 | ||||||
P.S. писал без студии, возможно using нужно на коллекции ставить, а не на поисковике.
0
|
||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||
| 22.10.2016, 21:39 | ||
|
0
|
||
|
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
|
|
| 22.10.2016, 21:41 [ТС] | |
|
Exerion , я с Вам полностью согласен!!!
В С# все без проблем. Но! C# это управляемый код, а мне нужен НАТИВНЫЙ!!! В С# мне нужно возвращать зашифрованные данные характеристик компьютера и передавать их потом на сайт для регистрации А у С# открытые исходники (в Reflector)
0
|
|
| 22.10.2016, 21:41 | |
|
Помогаю со студенческими работами здесь
13
Обмен данными Обмен данными Обмен данными Обмен данными Обмен данными м/у УТ И БП Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|