![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| ParaPik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
У меня есть dll, в которой реализован интерфейс для работы с движком распознавания речи. Она написана на C++. Проблема заключается в непонятном для меня поведении механизма P/Invoke. Инициализация движка проходит успешно. Но проблема появляется, когда я пытаюсь получить результат распознавания. Вот обертка в C#:
Когда я диктую короткие фразы, скажем, два-три слова, то все работает нормально. Но когда я диктую чуть больше, то сразу получаю AccessViolation. Причем если я использую эту dll в native приложении на C++, то никаких проблем нет, все работает замечательно. Помогите разобраться, в чем дело. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
берите нативный отладчик (в студии ставьте галку в настройках проекта->debug->unmanaged code) и вперед - за отладкой )
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| ParaPik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Так в том то и дело, что я все перепроверил. Функция в dll возвращает нормальный указатель. Но через P/Invoke этот указатель не проходит. Я просто заметил, что исключение возникает только при возвращении указателя на относительно длинную строку. Для хранения строк использую std::string и std::vector. Память, на которую указывает указатель, не очищается в том момент, когда .net переводит строку в тип string.
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
std::string это, конечно, круто... но... но как бы надо тогда возращать .c_str() методом данные (чтобы был NULL вконце) (и в векторе это учитывать)...
"перепроверяйте еще раз", что можно сказать.. мы тут наврядли сможем помочь. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| ParaPik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Я лучше просто приложу код:
|
|||
|
||||
| ParaPik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Для эксперимента решил проверить на Java. Там тоже все работает прекрасно.
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
ParaPik, ради эксперимента попробуйте просто захардкодить (только не константно) длинную строку (в отдельной длл-ке, не привязанной к вашему проекту вообще) и получить ее в C#. Если проблем не будет то моё мнение - косяк где-то у вас (не обязательно в этом методе)....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| ParaPik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Я с вами согласен, jonie, что в первую очередь надо было проверить именно это. Функция в тестовой dll генерирует строку длиной в 256 символов. Результат: выброс Access Violation.
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |