Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 239

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты! Вот уже какой час бьюсь, не могу разобраться.
Моя программа использует функции, которые лежат в data.dll. Программа работает все как надо, но когда нажимаю "Закрыть" выдается ошибка:
"Exception EAccessViolation in module Data.DLL at 00001479. Access violation at address 00331479 in module 'data.DLL'. Write of address 00B49d34 "
Затем еще одна:
"Runtime error 216 at 00336F6"
Они повторяются друг за другом бесконечно. И выходит так , что программа закрывается лишь через диспечер...
Исходник прикрепляю к вопросу...

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Примечание #1 (27 декабря 2008, 19:02):
Delphi 2007

Ученый Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ученый (статус: 8-ой класс)
Вопрос отправлен: 27 декабря 2008, 18:58
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 13; последнее сообщение — 28 декабря 2008, 20:16; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 27 декабря 2008, 19:16 [#1]:

Исходник скачать не удалось.
Интересно, что это за такой монструозный исходник, если он весит 386 кб В АРХИВЕ?

Предположу, что ты передаёшь динамические данные (строки, объекты и т.п.) в DLL и обратно. Это не есть гут.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ученый

Ученый (статус: 8-ой класс), 27 декабря 2008, 19:21 [#2]:

Исходник можно скачать здесь http://webfile.ru/2514795.
Да я действительно передаю строки, но только из Dll, обратно ничего не отправляется. Подскажите как можно исправить....
min@y™

min@y™ (статус: Доктор наук), 27 декабря 2008, 19:33 [#3]:

Цитата:


Подскажите как можно исправить....


Передавай только PChar. Никаких string и потомков TObject. ShareMem, если есть в uses, выкинь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ученый

Ученый (статус: 8-ой класс), 27 декабря 2008, 19:37 [#4]:

Если вас не затруднит, не моглибы вы посмотреть исходник и подсказать что необходимо исправить...
min@y™

min@y™ (статус: Доктор наук), 27 декабря 2008, 19:45 [#5]:

Я ненавижу разбираться в чужих исходниках, особенно ТАКОГО размера.
Передавай PChar вместо string. И всё. В инете материалов по этому поводу - ВАГОН.

Щас у меня тут вечер, концерт Задорного скоро, я пью пиво с воблой. Ну как ты думаешь, у тебя на моём месте возникло бы желание копаться в чужих исходниках при таких начальных условиях?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ученый

Ученый (статус: 8-ой класс), 27 декабря 2008, 19:52 [#6]:

Понимаю...И на этом спасибо...Буду работать.... Удачного вечера!
Ученый

Ученый (статус: 8-ой класс), 27 декабря 2008, 20:41 [#7]:

То min@y™ Спасибо! Все разобрался. Преобразовал строки в PChar и все пошло...... Но есть одно но.... в ходе выполнения программы вылетает ошибка:
"Access violation at address 00404a4F in module 'Project1.exe'. Read of address 00000035."
Нажимаешь ок, и программа дальше себе работает. Чем может быть вызвана эта ошибка?
min@y™

min@y™ (статус: Доктор наук), 27 декабря 2008, 20:57 [#8]:

Да хрен его знает. Access violation - это самая мерзкая ошибка. Её в общем случае надо локализовывать и ликвидировать только в дебаггере.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ученый

Ученый (статус: 8-ой класс), 27 декабря 2008, 21:03 [#9]:

Все нашел ошибку.... программа не виновата....программист такой.....
min@y™

min@y™ (статус: Доктор наук), 27 декабря 2008, 21:12 [#10]:

Нет. Сегодня я пас. У меня тут пиво, вобла и кот. Завтра пиши, я на работу (если) приду и научу. :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ученый

Ученый (статус: 8-ой класс), 28 декабря 2008, 14:56 [#11]:

Дак как на счет "локализовывать и ликвидировать только в дебаггере"?
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 28 декабря 2008, 17:00 [#12]:

Я надеюсь, что перед закрытием программы, Вы выгружаете свою DLL:
--------
var
Handle: THandle;
MyImportProc: TMyProc;

begin
Handle := LoadLibrary('data.DLL');
if Handle >= 32 then { if <=32 - error ! }
begin
@MyImportProc := GetProcAddress(Handle, 'MYEXPORTPROC');
if MyImportProc <> nil then
... {используем процедуру из DLL}
end;
FreeLibrary(Handle); { выгружаем dll }
end;

Попробуйте использовать обработчик ошибок:

except
ShowMessage('Ошибка при попытке использовать dll !');
finally
FreeLibrary(Handle01); { выгружаем dll }
end;
Ученый

Ученый (статус: 8-ой класс), 28 декабря 2008, 20:16 [#13]:

Градов Ю.М. с этим я уже разобрался.... Все проблемы были из-за строк,передаваемых из DLL.....Просто заменил String на PChar

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 февраля 2020, 12:06
Выполнено за 0.02 сек.
Рейтинг@Mail.ru