|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.11.2011, 10:30 | #1 |
Пользователь
Регистрация: 17.08.2009
Сообщений: 10
|
Инциализация run-time пакетов и модулей. Проблема с константами
Добрый день, уважаемые форумчане! Столкнулся с одной неприятной проблемой, касательно инициализации строковых констант.
Имеется экзешник (EXE) и три пакета (MainPackage, Utils и TestPackage). Экзешник собран с Run-Time пакетами и использует пакет MainPackage. Пакет MainPackage использует Utils. При старте, соответственно, экзешник тянет пакет MainPackage, который, в свою очередь, тянет пакет Utils. Пакет TestPackage загружается экзешником динамически. MainPackage использует только некоторые модули из Utils. А TestPackage использует один единственный модуль из пакета Utils (назовем его TestUnit.pas). Что я наблюдаю. При старте программы, автоматически загружаются пакеты MainPackage и Utils. В пакете Utils инициализируются только те модули, которые используются в MainPackage. Модуль TestUnit.pas не инициализируется. Когда я загружаю пакет TestPackage, только тогда TestUnit.pas инициализируется. А при выгрузке пакета, модуль финализируется. И тут появляется проблема. В модуле TestUnit.pas объявлен константый массив строк. При первой инициализации модуля, с ними все в порядке. А при второй, все строки пустые. Если поменять в константах String на ShortString, то все нормально, но тогда у массива получается неоправданно большой размер. Как можно с этим бороться? |
26.11.2011, 13:48 | #2 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Скорее всего проблема в особенности работы с "родными" строками Делфи в подключаемых модулях. Используйте тип PChar в межмодульном обмене.
"ковыряю изнутри" (с)
|
26.11.2011, 14:27 | #3 |
Пользователь
Регистрация: 17.08.2009
Сообщений: 10
|
Дык нет никакого межмодульного обмена. Константа объявлена в модуле и там же используется. И больше нигде. Так вот каждый раз при загрузке пакета TestPackage, я вижу, что инициализируется модуль TestUnit.pas. А при выгрузке финализируется. Хотя этот модуль лежит в пакете Utils, который загружается только один раз при старте. Может так оно и должно быть, не знаю, но строковые константы отваливаются, при повторной инициализации модуля TestUnit.pas.
|
26.11.2011, 14:47 | #4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
По-идее константные строки хранятся в коде и не требуют инициализации. Покажите как объявлен ваш константый массив строк. И проверьте, что TestUnit.pas не содержит директивы $WEAKPACKAGEUNIT ON.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
26.11.2011, 17:32 | #5 | |
Пользователь
Регистрация: 17.08.2009
Сообщений: 10
|
Цитата:
Объявление массива: Код:
Жду комментарии. |
|
26.11.2011, 18:00 | #6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
хм, действительно, даже константный массив автоматом финализируется (нахрена?). Память, естественно, не освобождается, т.к. она и не выделялась, но ссылки на строки затираются nil. Похоже, единственный выход — использовать ShortString, а чтобы каждая строка не занимала 256 байт, задайте макс. длину, например ShortString[6], благо, у вас строки короткие.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
26.11.2011, 18:19 | #7 | |
Пользователь
Регистрация: 17.08.2009
Сообщений: 10
|
Цитата:
|
|
26.11.2011, 18:37 | #8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Кстати, если string заменить на PChar, как подсказал 3D Hunter, финализация для массива не будет вызываться
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 26.11.2011 в 18:44. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Run-time error '5692' | caute | Microsoft Office Word | 11 | 09.10.2011 20:45 |
Создать record в Run-time | ebuchiysayt_ebuchi | Общие вопросы Delphi | 7 | 31.07.2011 19:02 |
"Проблема" при создании компонентов в run-time | HyperZen | Общие вопросы Delphi | 2 | 16.06.2011 14:58 |
Run-time error 13 | olimpus | Microsoft Office Excel | 11 | 25.12.2010 22:49 |
Run-Time Check Failure #3 | Xe[N]o | Общие вопросы C/C++ | 2 | 27.11.2010 09:01 |