![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
В своей программе я использую процедуры из DLL.
В статье Петровича я прочитал, что для того, чтобы небыло проблем со строками нужно подключить модуль ShareMem и вместе с программой размещать библиотеку BORLNDMM.DLL. Возникла проблема в том, что после подключения зтих модулей, в моей программе (При закрытии) начала возникать ошибка Run Time Error. Кто нибудь сталкивалься с этой проблемой? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ошибка возникает при подключении ShareMem или BORLNDMM.DLL??
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Ошибка возникает при подключении ShareMem.
Но я уже узнал в чем проблема, оказывается что при подключении этого модуля его имя должно стоять первым в списке подключаемых модулей!!! Я честно говоря не понимаю, почему разработчики так решили. |
|||
|
||||
| Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Телепатирую, так как код, где ты добавляешь эти модули, не приведен. Модуль ShareMem нужно добавить в список uses ПЕРВЫМ и в DLL и в файл проекта программы - .DPR Добавлено @ 15:41
Потому что в модуле ShareMem переопределяется используемый менеджер памяти. Соответственно, любой модуль, который использует функции перераспределения памяти, долджен использовать этот новый менеджер памяти;) -------------------- |
||||
|
|||||
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Раньше я думал, что в разделе Uses модули можно перечислять в каком угодно порядке.
Просто береш и перечисляеш места, где компилятору искать нужный код. Оказывается это не совсем так... |
|||
|
||||
| Guedda |
|
|||
![]() Подрывник ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3137 Регистрация: 27.12.2005 Где: Ростов-на-Дону Репутация: 14 Всего: 78 |
Этот модуль можно и не использовать. Просто параметры переделать из string в Pchar либо AnsiString
И все будет замечательно. Поверь... -------------------- Ll 2 |
|||
|
||||
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Я пробовал использовать PChar вместо String, все равно проблемы:
если параметр "входной", то все ОК, если же "выходной" то возникает ошибка при вызове данной процедуры. |
|||
|
||||
| Guedda |
|
|||
![]() Подрывник ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3137 Регистрация: 27.12.2005 Где: Ростов-на-Дону Репутация: 14 Всего: 78 |
А как пользовались процедурой с PChar?
-------------------- Ll 2 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Guedda
И все будет замечательно. Вряд ли. Для работой со строками в DLL нужно придерживаться вполне определенных правил, будь то PChar или String, а также любые динамически распределяемые ресурсы памяти. Основное правило - память освобождается там же, где выделяется. Если в DLL была выделена память, в DLL же ее нужно освободить. -------------------- |
|||
|
||||
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
А почему тогда в "предисловии" DLL пишут, что для того чтобы не пользоваться модулем ShareMem можно
использовать типы pChar или String[..]. |
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Для работы в Dll со строками использование sharemem обязательно. Многие мне могут возразить: как же так у меня все и без него работает, да действительно ошибки возникают не всегда и связано это с размещением данных в памяти затрут или не затрут их до того момента, когда вы попытаетесь к ним обратиться. У меня в жизни был случай, когда программа год проработала без этого модуля, и было выпущено два релиза, но потом при банальной доработке кода (ни как не связанного с передачей данных в dll и обратно) все рухнуло. При этом наблюдались просто не вероятные вещи программа, то работала, то нет, отловить ошибки долгое время не удавалось. Когда понял в чем все-таки дело, то долго не мог понять, как до этого все работало. Конечно распространение своей программы с BORLNDMM.DLL не очень удобно (можно забыть, пользователи удалят и т.д) Лично я не поставляю эту dll не с одним своим проектом и не пользуюсь стандартным модулем sharemem. В место него я использую fastsharemem, которому для работы не нужна, ни какая дополнительная dll. Пользуюсь уже года 4 и за это время, проблем с этим модулем никогда не было.
Это сообщение отредактировал(а) Alex - 9.1.2006, 19:14 -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Можно использовать без излишних премудростей передачу параметров в DLL как PChar, String[], и даже просто String(AnsiString), если внутри DLL они будут использоваться только для чтения, т.е. не будет перераспределения памяти. String[]- это строка фиксированной длины, для нее память перераспределить нельзя, поэтому массивы символов String[] можно использовать свободно, но ведь ограничение длины в 255 нечасто может устроить? -------------------- |
|||
|
||||
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Alex можно немного подробнее о fastsharemem. А то у меня полхо с английским.
Этот модуль можно использовать так - же само как и sharemem? Или есть какие то ограничения? Это сообщение отредактировал(а) AndreyANM - 9.1.2006, 20:13 |
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Ни каких ограничений - это полная замена. Подключаешь его первым модулем в uses и все
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| AndreyANM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Спасибо, я уже разобрался, все отлично работает.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |