Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с P/Invoke 
V
    Опции темы
ParaPik
Дата 31.7.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



У меня есть dll, в которой реализован интерфейс для работы с движком распознавания речи. Она написана на C++. Проблема заключается в непонятном для меня поведении механизма P/Invoke. Инициализация движка проходит успешно. Но проблема появляется, когда я пытаюсь получить результат распознавания. Вот обертка в C#:

Код

[DllImport(@"C:\Users\__ParaPik__\Documents\Visual Studio 2010\Projects\Research Works\Debug\SRE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern string GetNextHyp();

Когда я диктую короткие фразы, скажем, два-три слова, то все работает нормально. Но когда я диктую чуть больше, то сразу получаю AccessViolation. Причем если я использую эту dll в native приложении на C++, то никаких проблем нет, все работает замечательно.

Помогите разобраться, в чем дело.
PM MAIL   Вверх
jonie
Дата 31.7.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



берите нативный отладчик (в студии ставьте галку в настройках проекта->debug->unmanaged code) и вперед - за отладкой )


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ParaPik
Дата 1.8.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Так в том то и дело, что я все перепроверил. Функция в dll возвращает нормальный указатель. Но через P/Invoke этот указатель не проходит. Я просто заметил, что исключение возникает только при возвращении указателя на относительно длинную строку. Для хранения строк использую std::string и std::vector. Память, на которую указывает указатель, не очищается в том момент, когда .net переводит строку в тип string.
PM MAIL   Вверх
jonie
Дата 1.8.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



std::string это, конечно, круто... но... но как бы надо тогда возращать .c_str() методом данные (чтобы был NULL вконце) (и в векторе это учитывать)...

"перепроверяйте еще раз", что можно сказать.. мы тут наврядли сможем помочь.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ParaPik
Дата 1.8.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Я лучше просто приложу код:
Код

const char * __stdcall GetNextHyp()
{
    EnterCriticalSection(&CSEC);
    const char * _res = "";
    if (SREHyps.size() != 0)    
        _res = SREHyps[SREHyps.size() - 1].c_str();    
    LeaveCriticalSection(&CSEC);
    return _res;
}

PM MAIL   Вверх
ParaPik
Дата 1.8.2011, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Для эксперимента решил проверить на Java. Там тоже все работает прекрасно.
PM MAIL   Вверх
jonie
Дата 1.8.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



ParaPik, ради эксперимента попробуйте просто захардкодить (только не константно) длинную строку (в отдельной длл-ке, не привязанной к вашему проекту вообще) и получить ее в C#. Если проблем не будет то моё мнение - косяк где-то у вас (не обязательно в этом методе)....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ParaPik
Дата 1.8.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Я с вами согласен, jonie, что в первую очередь надо было проверить именно это. Функция в тестовой dll генерирует строку длиной в 256 символов. Результат: выброс Access Violation.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.