Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ShareMem и BORLNDMM.DLL, Возникают ошибки при закрытии приложения 
V
    Опции темы
AndreyANM
Дата 9.1.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В своей программе я использую процедуры из DLL.
В статье Петровича я прочитал, что для того, чтобы небыло проблем со строками нужно
подключить модуль ShareMem и вместе с программой размещать библиотеку BORLNDMM.DLL.

Возникла проблема в том, что после подключения зтих модулей, в моей программе (При закрытии) начала возникать
ошибка Run Time Error.

Кто нибудь сталкивалься с этой проблемой?
PM MAIL   Вверх
Alexeis
Дата 9.1.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Ошибка возникает при подключении ShareMem или BORLNDMM.DLL??


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AndreyANM
Дата 9.1.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ошибка возникает при подключении ShareMem.

Но я уже узнал в чем проблема, оказывается что при подключении этого модуля
его имя должно стоять первым в списке подключаемых модулей!!!

Я честно говоря не понимаю, почему разработчики так решили.
PM MAIL   Вверх
Демо
Дата 9.1.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(AndreyANM @ 9.1.2006, 15:22 Найти цитируемый пост)

Возникла проблема в том, что после подключения зтих модулей,


Телепатирую, так как код, где ты добавляешь эти модули, не приведен.

Модуль ShareMem нужно добавить в список uses ПЕРВЫМ и в DLL и в файл проекта программы - .DPR
Добавлено @ 15:41
Цитата(AndreyANM @ 9.1.2006, 16:39 Найти цитируемый пост)

Я честно говоря не понимаю, почему разработчики так решили.


Потому что в модуле ShareMem переопределяется используемый менеджер памяти. Соответственно, любой модуль, который использует функции перераспределения памяти, долджен использовать этот новый менеджер памяти;)


--------------------
    
PM MAIL ICQ Skype   Вверх
AndreyANM
Дата 9.1.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Раньше я думал, что в разделе Uses модули можно перечислять в каком угодно порядке.
Просто береш и перечисляеш места, где компилятору искать нужный код.

Оказывается это не совсем так...
PM MAIL   Вверх
Guedda
Дата 9.1.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



Этот модуль можно и не использовать. Просто параметры переделать из string в Pchar либо AnsiString
И все будет замечательно.
Поверь... smile


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
AndreyANM
Дата 9.1.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я пробовал использовать PChar вместо String, все равно проблемы:
если параметр "входной", то все ОК,
если же "выходной" то возникает ошибка при вызове данной процедуры.
PM MAIL   Вверх
Guedda
Дата 9.1.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



А как пользовались процедурой с PChar?


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Демо
Дата 9.1.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Guedda
И все будет замечательно.

Вряд ли.

Для работой со строками в DLL нужно придерживаться вполне определенных правил, будь то PChar или String, а также любые динамически распределяемые ресурсы памяти.

Основное правило - память освобождается там же, где выделяется. Если в DLL была выделена память, в DLL же ее нужно освободить.


--------------------
    
PM MAIL ICQ Skype   Вверх
AndreyANM
Дата 9.1.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А почему тогда в "предисловии" DLL пишут, что для того чтобы не пользоваться модулем ShareMem можно
использовать типы pChar или String[..].
PM MAIL   Вверх
Alex
Дата 9.1.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Для работы в Dll со строками использование sharemem обязательно. Многие мне могут возразить: как же так у меня все и без него работает, да действительно ошибки возникают не всегда и связано это с размещением данных в памяти затрут или не затрут их до того момента, когда вы попытаетесь к ним обратиться. У меня в жизни был случай, когда программа год проработала без этого модуля, и было выпущено два релиза, но потом при банальной доработке кода (ни как не связанного с передачей данных в dll и обратно) все рухнуло. При этом наблюдались просто не вероятные вещи программа, то работала, то нет, отловить ошибки долгое время не удавалось. Когда понял в чем все-таки дело, то долго не мог понять, как до этого все работало. Конечно распространение своей программы с BORLNDMM.DLL не очень удобно (можно забыть, пользователи удалят и т.д) Лично я не поставляю эту dll не с одним своим проектом и не пользуюсь стандартным модулем sharemem. В место него я использую fastsharemem, которому для работы не нужна, ни какая дополнительная dll. Пользуюсь уже года 4 и за это время, проблем с этим модулем никогда не было.

Это сообщение отредактировал(а) Alex - 9.1.2006, 19:14


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Демо
Дата 9.1.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(AndreyANM @ 9.1.2006, 19:48)
А почему тогда в "предисловии" DLL пишут, что для того чтобы не пользоваться модулем ShareMem можно
использовать типы pChar или String[..].

Можно использовать без излишних премудростей передачу параметров в DLL как PChar, String[], и даже просто String(AnsiString), если внутри DLL они будут использоваться только для чтения, т.е. не будет перераспределения памяти.

String[]- это строка фиксированной длины, для нее память перераспределить нельзя, поэтому массивы символов String[] можно использовать свободно, но ведь ограничение длины в 255 нечасто может устроить?


--------------------
    
PM MAIL ICQ Skype   Вверх
AndreyANM
Дата 9.1.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Alex можно немного подробнее о fastsharemem. А то у меня полхо с английским.
Этот модуль можно использовать так - же само как и sharemem?
Или есть какие то ограничения?

Это сообщение отредактировал(а) AndreyANM - 9.1.2006, 20:13
PM MAIL   Вверх
Alex
Дата 9.1.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Ни каких ограничений - это полная замена. Подключаешь его первым модулем в uses и все


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
AndreyANM
Дата 9.1.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, я уже разобрался, все отлично работает.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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