Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Здравствуйте уважаемые Гуру! Сразу прошу вас не пинать больно, так как я новичок Собственно не могу сообразить как передать в C#, полученный в dll на c++ набор записей из SQLite. Использовать NET System.Data.SQLite для работы пожалуйста не предлагайте. C# используется только для пользовательского интерфейса, а вся работа с базой (запросы) осуществляется только в DLL на с++. Параметры для DLL я передаю из C# и обратно строковые данные тоже могу получить. А вот как можно передать из dll результирующий набор записей в C# (в виде объекта) на подобии DataTable в .NET чтобы присвоить как sourse DataGridView (если таковое возможно)? Или заполнять Grid построчно, но опять таки нужен полученные из dll объект (набор строк) Направьте пожалуйста мысль в правильную сторону. Мое гугление пока без нужного результата. Можно ли это сделать Маршалингом, если да, то подскажите как. С маршалингом простых данных я разобрался. А вот как со сложными структурами или объектами...? Как их подготовить в С++ к передаче и в С# распаковать не могу понять. Еще была мысль использовать JSON и передавать одной строкой. Распаковать строку JSON в объект С# я распакую, а вот как запаковать объект (набор записей) в строку JSON на стороне dll не нашел. Библиотеки json для с# и С++ в наличии. Вопрос корости работы такой связки пока не очень критичен, но желательно иметь в виду. Может есть другие решения, если приведете кусочек кода буду счастлив безмерно! Заранее благодарен откликнувшимся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 20:22 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitА вот как со сложными структурами или объектами...? можно передать в c# XML, пригодный для прямой десериализации в dataset Модератор: Отредактировано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 20:49 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, безмерно рад общению! :) а "анально" - это как перевести? Это как - "банально" или это как - через " *опу" :) Я шучу, просто рад встрече А что лучше использовать в моем случае с точки зрения производительности, XML или jcon? Я так понял что если - XML, то можно подключить как source к гриду, а если - json, то только заполнить грид строками в цикле из объекта после распаковки json? По скорости это не будет иметь значения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 21:31 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
>Направьте пожалуйста мысль в правильную сторону 1. Читать учебники 2. Пока достаточно не прочитал, использовать стандартные средства работы с СУБД из C# 3. Не писать в С++ топик без оснований ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 21:46 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, спасибо большое! Как всегда, кратко и исчерпывающе! Именно то что мне нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2017, 23:05 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, доброго дня! Изопропил можно передать в c# XML, пригодный для прямой десериализации в dataset А можно сериализовать/десериализовать объект DataTable без помещения его предварительно в контейнер DataSet? Я обычно сразу загружаю вот так, если всего одна таблица: Код: c# 1. 2. 3. или без DataSet это не работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 16:29 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Спасибо большое!!! Все работает великолепно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 22:23 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Прошу заранее прощения за беспокойство! Использовал XML для передачи набора строк из SQLite и все было хорошо, в DataTable все загружалось! Любые данные! Но это работало на очень маленьких наборах строк Когда же понадобилось передать из С++ в С# данные из более чем 33-34 строк(в зависимости от количества полей) Получаю пустой DataTable. Это что, недостаточно памяти выделяется для DataTable? Подскажите пожалуйста как можно решить эту задачу. Может я не учел чего-то формируя XML в С++? Или неправильно принимаю XML в С#? Заранее благодарен за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2017, 23:13 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit, ты в ГитХабе есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2017, 23:39 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Siemargl, Еще раз повторюсь. Код рабочий. Данные любые отправляются и принимаются!!! Проблема только в том, что если набор строк превышает предел (у меня это - 33 строки) сериализованная строка не принимается из DLL Получаю исключение: {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."} Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2017, 23:54 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
mayton, откуда мне там быть? :)) Я не профи, я просто люблю программирование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2017, 23:56 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Туда не нужен пропуск профи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 08:20 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Модератор: Отредактировано Нужен код DLL_Select - в ней не выделяется достаточно памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 16:33 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Siemargl, Да я понял что мало памяти. В dll формирование XML строки проверил - все правильно Сейчас сам попробую найти косяк с памятью. Если не получится то побеспокою Вас Спасибо за желание помочь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 16:45 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Siemargl, Я делал так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. В 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. У меня есть подозрение, что в таком исполнении передачи строки, в памяти выделяется какой-то default размер И все, что превышает - лезет в защищенную память. Видимо нужно передавать строку, как байтовый массив и возвращать указатель на этот массив и размер его. А в С# получать указатель как IntPtr и переводить массив в string Или есть более правильное решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 17:38 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit//Перевожу ее в base64 и возвращаю: И возвращаешь указатель на уже освобождённую память. Модератор: Отредактировано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 17:52 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, А нельзя ли чуть полегче, без цитат И чуть подробнее Я не профи и не студент, и вообще не технарь. Я из другого "цеха" я программирую мозги на любой "платформе". А сейчас изучаю другое программирование и по ходу пишу свой маленький проектик. Давайте дружить! :) Приведенный код работает, но до определенного объема передаваемых данных Если можете пролить свет, буду благодарен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 18:19 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitЯ не профи и не студент, и вообще не технарь. Я из другого "цеха" я программирую мозги на любой "платформе". Ок, перевожу на лекарский: ты посылаешь сестру за пациентом с койки номер шесть. Но ты не позаботился о том, чтобы этого пациента не трогали, поэтому он давно умер, был вскрыт, расфасован на органы и частично кремирован. То, что тебе притащит сестра может быть куском нужного пациента, а может быть и вообще левым пациентом, которому не повезло занять эту койку гораздо позже. Если не повезёт, то там вообще не окажется этой койки, поскольку она сгорела вместе с госпиталем. А теперь таки начни изучать что такое компьютеры, как они работают, что такое память и как ею следует управлять с тем, чтобы и койка была на месте и пациента не порезали до момента как его к тебе привезут. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 19:20 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Да... А я к Вам ведь, батенька, на ВЫ, И больше чем уверен, что вдвое если не больше старше Вас.. А ведь некоторое время назад я получил от Вас достаточно приличную для меня помощь и, причем, без всяких понтов. Я даже прилюдно выразил свою Особую благодарность Вам и другим Вашим коллегам Если бы у Уважаемого Изопропила была минутка свободного времени, он бы не писал так много букв, Одно предложение - и решение вопроса было бы найдено. Достойный пример для подражания! Ну да ладно, бог Вам судья На этом закончим общение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 20:15 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit..И больше чем уверен, что вдвое если не больше старше Вас..Эт врядли, столько пока не живут=) В общем проблема в том, что твой strXML.c_str() уничтожен по выходу из функции, как локальная переменная. Лучше передавай функции свой буфер нужного (с запасом размера), в который будет писаться результат. С bstr тоже можно, но контролировать кто создает и освобождает ее память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 21:30 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit, не переживай док! Поможем тебе. А все нехорожие и злые поциенты будут прокапаны и проклизьмены и уложены спать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 21:35 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
SiemarglЛучше передавай функции свой буфер нужного (с запасом размера), в который будет писаться результат. Пока помню, еще его надо залочить в памяти,чтобы GC не передвинул. Все в MSDN есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2017, 21:48 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Siemargl, SiemarglВ общем проблема в том, что твой strXML.c_str() уничтожен по выходу из функции, как локальная переменная. Объясните пожалуйста "особоодаренному" почему: не смотря на это я получаю в С# XML строку десериализую ее и гружу благополучно в grid? Проблема только в том что при передаче строки длиной больше определенного значения вылетает исключение Есть у меня еще вариант. Я передавал из 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. В C++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Можно пойти этим путем при передачи строки, но теперь нужно перегнать string в байтовый массив и как быть с символом конца строки? записывать его в массив или нет для передачи из DLL в С#? И как лучше сделать это преобразование? Массив будет большой там будет много данных для грида и памяти нужно будет много и как я понял, по результатам гугления нужен непрерывный блок памяти Что подскажите? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 00:06 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitОбъясните пожалуйста "особоодаренному" почему: не смотря на это я получаю в С# XML строку десериализую ее и гружу благополучно в grid? Проблема только в том что при передаче строки длиной больше определенного значения вылетает исключение Тебе Сибиряков именно на этот вопрос и ответил, только на своем языке. Ладно, переведу: Освобожденная память локального объекта, в которой была полная правильная строка xml, все еще может полностью или частично принадлежать твоему процессу, и если повезет - даже с правильными не затертыми данными. На маленьких размерах тебе везет (хотя дело не в везении, конечно, а в том, что менеджер памяти резервный буфер оставил в этом месте, плюс другие потоки не пишут (пока) туда). Медсестра принесла часть трупа)) Сделай, например, так: 1. Выдели вручную память (под строку) в dll под эту строку (xml.c_str), скопируй в нее данные, ее и возвращай в c# 2. Сделай в dll функцию cpp_free с параметром - указатель на строку, в функции просто удаляй память 3. В c# после использования строки вызови cpp_free Думаю, должно заработать, если шарп "не испортит (не передвинет) указатель", но тут я уже не разбираюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 03:25 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
YuRock, спасибо большое YuRockОсвобожденная память локального объекта, в которой была полная правильная строка xml, все еще может полностью или частично принадлежать твоему процессу, и если повезет - даже с правильными не затертыми данными . Все кратко и понятно! Разве трудно было написать Сибирякову эти две строчи? Ан нет... ладно проехали YuRock2. Сделай в dll функцию cpp_free с параметром - указатель на строку, в функции просто удаляй память 3. В c# после использования строки вызови cpp_free Мне не хочется дважды обращаться к DLL - второй раз для очистки памяти. Хочется за один раз а если я сделаю как писал выше C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 12:19 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitОсвобожу память здесь по полученному указателю из DLL - это будет правильно??? Способ выделения памяти должен соответствовать способу её освобождения. Нельзя пришивать руку на место ноги. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 12:49 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbitа если я сделаю как писал выше C# Код: c# 1. 2. 3. Нельзя так делать, потому что разные менеджеры памяти по разному работают, если по-простому объяснять, то память не выделяется каждый раз, а просто выдается кусок ранее выделенной и делается отметка что кусок занят. Эти отметки разные менеджеры памяти делают по-разному. Поэтому освобождать память надо теми же средствами что и выделять, т.е. если выделил ее malloc() в С++, то и освободить надо вызовом free() в C++. Проще всего сделать как YuRock предложил, т.е. добавить в DLL функцию Код: plaintext 1. 2. 3. И ее вызвать из C# Код: c# 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 12:55 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Всем большое большое спасибо все понятно! Последний вопрос: В DLL мне надо string перевести в массив, на который я передаю указатель. 1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? в C# массив ведь нужно будет снова преобразовывать в строку. Как это правильно сделать? В общем у меня все вопросы сейчас крутятся вокруг темы обмена различными данными между managed и unmanaged кодом Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 15:48 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
string в С++ и C# разные вещи, первый в ANSI кодировках, второй с юникоде, поэтому лучше в C# принимать как массив байт, а затем конвертировать в строку. Код: plaintext 1. 2. По поводу нуля: он не нужен, если надо только записать для последующего чтения в C# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:00 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? лучше сразу char(wchar_t, юникод UTF-16) использовать) нулевой терминатор - записывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:36 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbitа если я сделаю как писал выше C# Код: c# 1. 2. Я тут ничего не понимаю, увы. Но что могу сказать: ты из C# заранее не знаешь и знать не можешь, сколько тебе необходимо памяти выделить. Ну можно, конечно, с запасом полтора гига выделят каждый раз, но это не вариант) ArbitМне не хочется дважды обращаться к DLL - второй раз для очистки памяти. Обращаешься ты один раз - при загрузке библиотеки. Далее ты просто вызываешь функции, которые уже ничем не отличаются от функций твоей программы. Впрочем, как хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:40 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
если выделять память под строку через ::SysAllocString и принимать как BSTR - никакого дополнительного кода не нужно, маршаллер сам справится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:47 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 18:15 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Сегодня мне счастье привалило, рад видеть! :) Читаю последний Ваш пост и в голове нестыковка по вопросу очистки памяти. Если я правильно понял, то очистка памяти в Вашем примере происходит не в том коде, в котором она выделялась Код: plaintext 1. 2. 3. 4. 5. Dimitry Sibiryakov и Дима Т в один голос говорят, что нужно чистить память там где она выделалась Ранее мы с Вами разбирали этот вопрос Изопропилкороче - возвращай из C - из сишного кода память выделенную CoTaskMemAlloc принимай в с# как IntPtr, Marshal.Copy - скопирует, Marshal.FreeCoTaskMem - освободит У меня это все работало и передавались данные (изображения) и нигде память не затиралась Говорят что мне просто везло Где-то я что-то напутал наверное. Проясните пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 19:52 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
YuRock, YuRockНо что могу сказать: ты из C# заранее не знаешь и знать не можешь, сколько тебе необходимо памяти выделить. Ну можно, конечно, с запасом полтора гига выделят каждый раз, но это не вариант) Не, память я выделяю в DLL и возвращаю в С# указатель на массив и его размер в параметре ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 19:55 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitDimitry Sibiryakov и Дима Т в один голос говорят, что нужно чистить память там где она выделалась это может упростить жизнь. Но если мы знаем, как память выделялась и как работает маршаллер(или вручную маршаллинг делаем) можно позволить себе выделять в одном месте, а освобождать в другом. главное чтоб единые распределители памяти использовались(CoTaskMemAlloc-CoTaskMemFree, SysAllocString-SysFreeString,GlobalAlloc-GlobalFree) ну а если случилось выделение malloc или new - только так, где выделяли освобождать следует. Например, массив, передаваемый по ссылке(ref) из c# кода маршаллером копируется в память, выделенную CoTaskMemAlloc. C-код в dll имеет полное право сделать CoTaskMemFree и CoTaskMemAlloc. а если строки передавались в массиве структур - то перед освобождением массива нужно ещё для строк сделать SysFreeString ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:11 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, авторArbit 1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? Изопропиллучше сразу char(wchar_t, юникод UTF-16) использовать) нулевой терминатор - записывать. Я сейчас передаю не короткие строки, а сериализованную XML строку с данными из базы для передачи их в DataTable Таблица в XML содержит 200-300 строк Такую большую XML строку тоже лучше передавать как массив char? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:19 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitТакую большую XML строку тоже лучше передавать как массив char?ну она не такая уж и большая. я бы string передал (и длину передавать не придётся) и в utf-16 сразу бы перекодировал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:25 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitИзопропил, авторArbit 1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? пропущено... . Я сейчас передаю не короткие строки, а сериализованную XML строку с данными из базы для передачи их в DataTable Таблица в XML содержит 200-300 строк Такую большую XML строку тоже лучше передавать как массив char? Прикинь в байтах: 200-300 строк даже если каждая 1 Кб, это всего 0.2-0.3 Мб, ниочем. Передавай как передастся и не заморачивайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:29 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ИзопропилArbitDimitry Sibiryakov и Дима Т в один голос говорят, что нужно чистить память там где она выделалась это может упростить жизнь. Но если мы знаем, как память выделялась и как работает маршаллер(или вручную маршаллинг делаем) можно позволить себе выделять в одном месте, а освобождать в другом. главное чтоб единые распределители памяти использовались(CoTaskMemAlloc-CoTaskMemFree, SysAllocString-SysFreeString,GlobalAlloc-GlobalFree ) ну а если случилось выделение malloc или new - только так, где выделяли освобождать следует. Например, массив, передаваемый по ссылке(ref) из c# кода маршаллером копируется в память, выделенную CoTaskMemAlloc. C-код в dll имеет полное право сделать CoTaskMemFree и CoTaskMemAlloc. а если строки передавались в массиве структур - то перед освобождением массива нужно ещё для строк сделать SysFreeString Вот она - Квинтэссенция!!! Огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:35 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Dima T, Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:36 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ИзопропилArbitТакую большую XML строку тоже лучше передавать как массив char?ну она не такая уж и большая. я бы string передал (и длину передавать не придётся) и в utf-16 сразу бы перекодировал Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:37 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Дорогие Гуру! Всем премного благодарен за помощь и внимание! Всем хорошего отдыха в грядущие выходные! Пошел ваять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:41 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit, примечание - максимум вспомогательного кода лучше иметь на одной стороне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 21:39 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
как же скучно я живу.... а тут столько эмоций на нечетном байте =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 21:39 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, А что подразумевается под вспомогательным кодом? И на какой стороне его предпочтительнее иметь? С++ или С#? Вообще у меня основной код в DLL - работа с базой, вся промежуточная обработка данных перед и после базы В С# только код по работе с пользовательским интерфейсом ввод и отображение данных Да, еще в С# есть код по работе с моим сервером в интернете, но я его тоже перенесу в DLL (пока до этого руки еще не дошли) Спасибо за совет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 03:51 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
вспомогательный код - например вот Arbit Код: c# 1. 2. имеет отношение к маршаллингу, но не к решаемой прикладной задаче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 08:30 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Изопропилимеет отношение к маршаллингу, но не к решаемой прикладной задаче Да, я учту это. Спасибо большое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 10:47 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, В итоге у получился такой вариант С++ Код: plaintext 1. 2. 3. 4. 5. 6. С# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Все работает, передаются любые объемы данных Теперь по очистке выделенной памяти: Память выделялась в С++ с помощью SysAllocString В С# маршаллер передал BSTR в string strXML А как теперь освободить память после заполнения DataTable? Есть Marshal.FreeCoTaskMem, Marsha.lFreeHGlobal, Marshal.FreeBSTR Но Marshal. SysFreeString не нашел Может - в данном случае это Marshal. FreeBSTR ? Или string strXML очистит сборщик мусора С#? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 15:25 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Или маршаллер в данном случае уже сам позаботился об очистке памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 16:11 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitИли маршаллер в данном случае уже сам позаботился об очистке памяти? да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 16:24 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitИли маршаллер в данном случае уже сам позаботился об очистке памяти? BSTR это OLE2, там все построено на счетчиках ссылок. честно говоря, я бы поверил Изопропилу, но перепроверил позднее, мало ли что думает дНет по этому поводу. только не маршаллер об этом заботится, а OLE подсистема, быть занудой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 23:04 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Siemargl, SysAllocString - внутри это CoTaskMemAlloc, никакого IUnknown и счётчиков ссылок Не стоит обобщать. А дотнет хорошо знает COM. Занудство не уместно- именно маршалер вызывает ole функции управления памятью, Для функций управления памятью OLE никакого подсчёта ссылок не производится - подсчёт ссылок только для COM интерфейсов работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2017, 07:42 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Если так, то в коде 20764900 утечка, т.к. нет освобождения того, что выделялось SysAllocString ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2017, 09:48 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Siemargl, Маршаллер освобождает (вызывает SysFreeString). - на основании того, что возвращаемая строка - BSTR Точно так же, как и древних VB и VBA с внешними функциями из dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2017, 10:11 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Безмерно благодарен всем за ликбез!!! Я заполнил большую брешь в своих познаниях благодаря вашим постам Пошел реализовывать все в проекте. Но я обязательно вернусь Может вы мне заранее подскажете что лучше почитать по теме реализации в приложении интерпретации подпрограммы на собственном макро-языке список всех лексем уже есть. Нужен свой парсер, я так понимаю. Еще раз всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2017, 19:34 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbitсписок всех лексем уже есть значит грамматику пора рисовать )) сначала рассмотреть вопрос об интеграции готового интерпретатора(javascript,python,lua,vbs...) если всё-таки нужен свой - «Книгу дракона» можно почитать ( https://www.ozon.ru/context/detail/id/3829076/ ) ну и классику изучать - Flex и Bison ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2017, 19:43 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Буду читать про Дракона:)) Если коротко, то пользователь , при работе с приложением может писать в RichTextBox настройки (инструкции) используя этот специфический простенький макроязык. Приложение, читая этот набор инструкций должно его распарсить и вызвать последовательность определенных функции, написанные мной на языке С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2017, 20:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018092]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
198ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 325ms |

| 0 / 0 |
