Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
ВнизПередача string в DLL. Найти похожие ветки
← →
NewN (2003-04-29 09:00) [0]Помогите разобраться. Дорабатываю не мной написанную программу. В программе активно используются DLL (каждый отчёт в отдельной DLL). И программа и DLL скомпилированы с Run-Time пакетами. Почти в каждой DLL вызываются функции из файла EXE (GetDatabaseName, GetCompanyName и др.), возвращающие тип string. При этом ни в EXE, ни в DLL не используется модуль ShareMem, нет выделения\освобождения памяти под string (это же указательный тип на динамический массив). Вопрос - почему же всё это работает правильно, и устойчиво (более чем за год использования программы в нескольких местах не было зафиксировано ни одной ошибки по этому поводу)?
← →
Крот (2003-04-29 09:46) [1]Чем отличается начинающий программист от опытного?
Начинающий не понимает почему его программа не работает.
Опытный не понимает почему его программа работает.
Поздравляю, вы опытный программист. :-)
← →
Anatoly Podgoretsky (2003-04-29 09:59) [2]Чудик, ты зачем усы сбрил, то есть убрал комментраий из модуля?
← →
NewN (2003-04-29 10:39) [3]>>Крот © (29.04.03 09:46)
- спасибо :-), но это же не моя программа, тот кто её написал наверно был опытнее меня, раз я этого не понимаю.
- а по существу? В комментарии недостаточно исчерпывающе. В комментарии написано, что Sharemem - mast be, если использовать строки. Если бы за время эксплуатации была замечена хоть одна ошибка при возвращении строк (Access violation, неверная передача строки), то я бы не раздумывал, дописал бы Sharemem, перекомпилировал бы и EXE и 20 DLL. А так получается - "Вы должны использовать Sharemem, и распростронять со своей программой Borlandmm.dll, хотя и без них всё прекрасно работает, а чем грозит их неиспользование никто не знает".
← →
Anatoly Podgoretsky (2003-04-29 10:50) [4]Если строки передаются и используются, то есть изменяются, то же относится и к другим вещам, которые основаны на менеджере памяти. Особо с объектами, там еще и RTTI
← →
han_malign (2003-04-29 10:57) [5]Во первых - поищи, возможно в одном из модулей DLL, все таки подключается ShareMem, этого достаточно.
А во вторых - проблемы начнутся когда будет использован механизм разделения ссылок "copy on edit", а если строки используются как константы(не изменяются во время обработки), передаются в методы без модификатора var,out(просто копируются в стек, и на ссылку кладется...), то проблем быть не должно... Строковой результат функции должен быть ссылкой на реальное поле класса, при этом в DLL не происходит аллокирование временной строки, которую потом попытается деаллокировать основное приложение... (на самом деле там все посложней, но это тема целой лекции)
← →
NewN (2003-04-29 11:12) [6]>>Во первых - поищи, возможно в одном из модулей DLL, все таки подключается ShareMem, этого достаточно.
- Забыл сказать, все DLL подключаются динамически, функцией LoadLibrary, и в одновременно может быть подгружена только одна из них. И Borlandmm.dll на компьютерах пользователей точно нет.
>>Строковой результат функции должен быть ссылкой на реальное поле класса,
- Вот это не понятно. В программе есть глобальная переменная DatabaseName: string, инициализируется при загрузке приложения, и экспортируемая функция GetDatabasename: string (Result:= DatabaseName), которая вызывается из DLL. И другие функции также реализованы.
← →
Cobalt (2003-04-29 11:21) [7]Какие модули (из стандартных) используются в ДЛЛ? Возможно, в них используется этот модуль?
А может, ShareMem не требуется при компиляции с run-time пакетами...
← →
Fredericco (2003-04-29 11:31) [8]Во-первых, я раньше не обращал внимания на коментарий в ДЛЛ про ShareMem, и передавал строки длиной до 255, все работало отлично.
Во-вторых, возможно я ошибаюсь, но при такой конструкции Result:= DatabaseName передается ссылка на глобальную переменную, которая не уничтожается при окончании работы процедуры/функции самой Дельфи.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c