Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-34477
Oleg__
2003-04-29 15:24
2003.05.12
Отображение HTML


14-34545
Separator
2003-04-23 11:32
2003.05.12
Как работать с утилитой TDump


6-34526
elf_123
2003-03-16 15:48
2003.05.12
Глупенький маленький вопросик(Client/Server Socket)


3-34356
PrettyFly
2003-04-22 15:21
2003.05.12
Фильтрация + DBGrid


1-34447
Матка
2003-04-28 02:33
2003.05.12
TListBox - перемещение элементов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский