Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.12;
Скачать: CL | DM;

Вниз

Передача 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
6-34536
Мыш
2003-03-15 09:39
2003.05.12
Сокеты


4-34644
squab
2003-03-11 23:04
2003.05.12
перетаскивание окна.


1-34387
SSK
2003-04-28 11:55
2003.05.12
выбор в TreeView


1-34457
Петр
2003-04-29 09:57
2003.05.12
Проблема с Объектами в форме MDI -приложения


3-34359
AleksChern
2003-04-22 16:09
2003.05.12
Нестандартная сортировка. Помогите !!!!