|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Здравствуйте уважаемые Гуру! Подскажите пожалуйста новичку как правильно осуществить сабж? DLL (C++ ) читает поле BLOB из базы SQLite в байтовый массив. Размер этого массива заранее неизвестен. Нужно передать массив в проект С# и отобразить изображение в PictureBox Вариант использовать нетовскую dll для работы с базой пожалуйста не предлагайте! Попутно вопрос - 1 как скопировать данные в новый массив (исходя из полученного указателя) сильно не пинайте! 2. как очистить память выделенную под массив в коде dll (желательного без повторного вызова DLL) В голову приходит только такая мысль (если она дурная, то поправьте пожалуйста): C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
C++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Заранее благодарен откликнувшимся ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 19:12 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Arbit1 как скопировать данные в новый массив (исходя из полученного указателя) сильно не пинайте! возвращаемый тип - лучше не byte* , а IntPtr копирование IntPtr в массив - Marshal.Copy(...) Arbit2. как очистить память выделенную под массив в коде dll (желательного без повторного вызова DLL) её незачем выделять, просто вернуть результат sqlite3_column_blob (а эту память освободит сам sqlite) а промежуточная dll - не нужна. здесь есть готовая c# функция и прочие полезности - https://github.com/makiuchi-d/sqlite-sharp/blob/master/SqliteSharp/Sqlite3.cs Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 00:37 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Arbit2. как очистить память выделенную под массив в коде dll (желательного без повторного вызова DLL) не выделять память с-шным рантаймом(new, malloc и т д) память, выделенная CoTaskMemAlloc/GlobaAlloc в c# легко управляется методами класса Marshal, а зачастую можно и штатным маршаллингом обойтись (при передаче параметров-массивов можно указать направление передачи и в каком из параметров находится длина массива ) в MSDN всё описано ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 07:53 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Изопропил, спасибо большое за помощь! Если я правильно понял, то для получения картинки из базы придется 2 раза дергать dll из шарпа? 1 - получить размер массива, 2 - получить указатель на массив Кроме того я не понял, как апишные функции импортируются в С# из dll если они находятся внутри другой функции, в которую передаются параметры для селекта нужной картинки....? Что-то в голове бардак по этому вопросу... Не сочти за труд растолкуй пожалуйста "особоодаренному" Извини что достаю, я итак стараюсь реже беспокоить ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 17:06 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Изопропил , прости! Я догнал, твой пример из ссылки которую ты дал. Но мне нужно через свою dll , потому что в dll прежде чем прочитать или записать в базу с данными происходят преобразования. А делать это в шарпе я не хочу. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 17:15 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
В догонку Кроме того у меня нет отдельной dll sqlite. У меня все скомпилировано в единый проект моей dll ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 17:20 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
ArbitВ догонку Кроме того у меня нет отдельной dll sqlite. У меня все скомпилировано в единый проект моей dll это не страшно короче - возвращай из C - из сишного кода память выделенную CoTaskMemAlloc принимай в с# как IntPtr, Marshal.Copy - скопирует, Marshal.FreeCoTaskMem - освободит( ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 18:06 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Изопропилкороче - возвращай из C - из сишного кода память выделенную CoTaskMemAlloc То есть все-таки дважды дергать dll + дважды обращаться к базе? 1 - в шарп получаю размер картинки 2 - в шарпе выделяю память CoTaskMemAlloc и передаю в dll указатель на нее и получаю картинку и очищаю память Marshal.FreeCoTaskMem Короче я попробовал еще такой вариант в одно обращение к dll (память выделяется в С++): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Но если я запускаю приложение из студии, то на строчке Marshal.FreeHGlobal(pArrImg) ;программа вылетает без всяких сообщений А если я запускаю экзешник из папки, то программа работает шустро, но... В Task Manager я вижу утечку памяти с каждой новой загрузкой картинки То есть Marshal.FreeHGlobal(pArrImg) память не освобождает. А ведь в MSDN написано: Освобождает память, выделенную ранее из неуправляемой памяти процесса.(MSDN) Почему так? Кстати FreeCoTaskMem(IntPtr) - это для задач COM. А в чем для моего случая разница между FreeCoTaskMem(IntPtr) и FreeHGlobal(IntPtr)? Что делать? Хочется в один клик Посоветуй ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 21:07 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
ArbitТо есть все-таки дважды дергать dll + дважды обращаться к базе? 1 - в шарп получаю размер картинки 2 - в шарпе выделяю память CoTaskMemAlloc и передаю в dll указатель на нее и получаю картинку и очищаю память Marshal.FreeCoTaskMem не так. в Шарп сразу получаешь и размер и указатель (память сразу выделяется в сишной dll) CoTaskMemAlloc - в сишном коде а очищаешь память в Шарпе - одно обращение к внешней DLL ArbitКстати FreeCoTaskMem(IntPtr) - это для задач COM. на заборе куй написано, а там - дрова для разных задач, активно используется для взаимодействия с неуправляемым кодом и COM-интеропа ArbitА в чем для моего случая разница между FreeCoTaskMem(IntPtr) и FreeHGlobal(IntPtr)? разные пулы памяти. главное - один и тот же использовать для управления одним участком памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 22:34 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
Изопропил, огромное спасибо! ИзопропилCoTaskMemAlloc - в сишном коде Вот оно ключевое слово!!! Все работает!!!! Изопропилне выделять память с-шным рантаймом(new, malloc и т д) Это имеется ввиду только ситуация когда связка С++ и С# и память выеляется на стороне С++? В чем тут причина? Еще раз благодарю за помощь! Гуру есть Гуру! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2017, 00:27 |
|
Получить изображение неизвестного размера (байтовый массив) из dll C++ --> C#
|
|||
---|---|---|---|
#18+
ArbitЭто имеется ввиду только ситуация когда связка С++ и С# и память выеляется на стороне С++? В чем тут причина? это бывает и без c# например,при взаимодействии dll, сделанных разными компиляторами или собранных со статически прилинкованным рантаймом. (у каждой dll может оказаться свой менеджер памяти) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2017, 05:58 |
|
|
start [/forum/topic.php?fid=20&fpage=45&tid=1399954]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 163ms |
0 / 0 |