Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема использования C++ ATL DLL в C# проекте, иногда при вызове DLL из C# server error 
:(
    Опции темы
bublik478
Дата 20.2.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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





проблема в следующем:

на С++ создана (ATL) DLL для использование в C# проекте.

в DLL пока тока одна функция, передаётся указатель на массив чисел INT (координаты X и Y, это полигон) и точка с координатами X,Y. Функция определят лежит ли точка внутри полигона или снаружи.

тест работает нормально, но в многократном вызове этой функции из C#  (раз 50-150 подряд) иногда выскакивает следующая ошибка:

"The server threw an exception."   

если у кого есть опыт посдкажите пожалуйста хотябы где начать рыть. С++ тока начал изучать и не хочу отказываться, работает быстрее, темболее есть возможность компилировать в Native code.

PM MAIL   Вверх
jonie
Дата 22.2.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а больше что ничего не говорит ?... ну там call stack До интеропов .... может и не там проблема ...
возмжно у вас память течет, возможно выходите за границы массива... да малоли что)


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


Новичок



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

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




нет, больше ничего не говорит!

может и память течет, правильно, малоли что!

вот поэтому и спрашиваю, где начать копать.

за рамки массива не может выйти, в С++ я передаю указатель на массив (на ячейку памяти) и передаю тип данных, и их кол-во, а С++ тупо перебирает память и ему всёравно к чему эта память относится к моей коллекции или это уже другие данные, ошибки никогда не будет!
это уже моя проблема корректные данные передать.

а как с памятью в С++? я просто передаю указатель на массив и пару целых чисел, нужно ли что-то чистить потом после работы этой фукции?? как я понимаю это не управляемый код и там нет гарбадж коллектора??? т.е. ушёл объект и память очистилась???
PM MAIL   Вверх
jonie
Дата 22.2.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

С++ тупо перебирает память и ему всёравно к чему эта память относится к моей коллекции или это уже другие данные,
а всели-равно среде .NET ?
Цитата

а как с памятью в С++? я просто передаю указатель на массив и пару целых чисел, нужно ли что-то чистить потом после работы этой фукции?? как я понимаю это не управляемый код и там нет гарбадж коллектора??? т.е. ушёл объект и память очистилась???
ябы передал еще и размер массива  smile  Чистить вам надо только то что Вы создали в С++ коде, c# сам позаботится о своей отчистке...

очень может быть что возникает исключение при заступе за границы массива...

в любом случае вы можете вооружится дебаггером (winDBG) 
вам поможет сайт http://www.dumpanalysis.org/


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


Новичок



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

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





jonie >> очень может быть что возникает исключение при заступе за границы массива...

c++ не генерирует ошибку привыходе за рамки массива, он просто перебирает память дальше, он не знает про масиив c# ничего.
а размер массива конечно я передаю из c#, чтоб с++ знал где остановится.

а дебагер я посмотрю, спасибо
PM MAIL   Вверх
jonie
Дата 23.2.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

c++ не генерирует ошибку привыходе за рамки массива

с++ нет, диспетчер памяти винды - легко. но при вызове из c# среда может ставить свои ловушки (SEH) и отлавливать уже в jit-е эти все вещи... дебаггер всем поможет)

попробуй
Код

int a[10];
int* p = a;
for(;++p;*p=0xBADC0DE);
судя по твоим словам "ниче не будет" )


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


Новичок



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

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




странно, передо мной книжка по с++ лежит Герберт Шилдт, там написано что ошибки не должно произойти, если передан указатель на первый член массива и если рамки цикла выходят за размер массива.

реально я попробовал специально ошибочный размер передавать, всегда больший чем надо!

и в 6 случаев из 10 получил абсолютно такую же ошибку как и имел вначале!

может когда память не блокировано с++ пользуется ей.  но если она недоступна то появляется ошибка?
PM MAIL   Вверх
jonie
Дата 24.2.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



языку пофиг что ты вышел за границы, а вот ОС вовсе не пофиг. Память в ОС выделяется странично, тыже пытаешься залесть на невыделенную страницу, и ОС жутко обижается и валит глюченное ПО. Почитай про менеджер памяти винды.
Происходит исключение ОС, а не языковое throw.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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