Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2011, 10:30   #1
ArkaNN
Пользователь
 
Регистрация: 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, то все нормально, но тогда у массива получается неоправданно большой размер.

Как можно с этим бороться?
ArkaNN вне форума Ответить с цитированием
Старый 26.11.2011, 13:48   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Скорее всего проблема в особенности работы с "родными" строками Делфи в подключаемых модулях. Используйте тип PChar в межмодульном обмене.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 26.11.2011, 14:27   #3
ArkaNN
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Скорее всего проблема в особенности работы с "родными" строками Делфи в подключаемых модулях. Используйте тип PChar в межмодульном обмене.
Дык нет никакого межмодульного обмена. Константа объявлена в модуле и там же используется. И больше нигде. Так вот каждый раз при загрузке пакета TestPackage, я вижу, что инициализируется модуль TestUnit.pas. А при выгрузке финализируется. Хотя этот модуль лежит в пакете Utils, который загружается только один раз при старте. Может так оно и должно быть, не знаю, но строковые константы отваливаются, при повторной инициализации модуля TestUnit.pas.
ArkaNN вне форума Ответить с цитированием
Старый 26.11.2011, 14:47   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

По-идее константные строки хранятся в коде и не требуют инициализации. Покажите как объявлен ваш константый массив строк. И проверьте, что TestUnit.pas не содержит директивы $WEAKPACKAGEUNIT ON.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.11.2011, 17:32   #5
ArkaNN
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
По-идее константные строки хранятся в коде и не требуют инициализации. Покажите как объявлен ваш константый массив строк. И проверьте, что TestUnit.pas не содержит директивы $WEAKPACKAGEUNIT ON.
Спасибо за ответ!

Объявление массива:
Код:
const FONT_TAGS_COUNT = 14;
      FONT_TAGS: array[0..FONT_TAGS_COUNT-1] of TFontTag = ((Tag: '[b]'; TagAction: taStyle; StyleTagType: stOpen; Style: fsBold),
                                                            (Tag: '[\b]'; TagAction: taStyle; StyleTagType: stClose; Style: fsBold),
                                                            (Tag: '[i]'; TagAction: taStyle; StyleTagType: stOpen; Style: fsItalic),
                                                            (Tag: '[\i]'; TagAction: taStyle; StyleTagType: stClose; Style: fsItalic),
                                                            (Tag: '[u]'; TagAction: taStyle; StyleTagType: stOpen; Style: fsUnderline),
                                                            (Tag: '[\u]'; TagAction: taStyle; StyleTagType: stClose; Style: fsUnderline),
                                                            (Tag: '[f+2]'; TagAction: taSize; DeltaSize: 2),
                                                            (Tag: '[f-2]'; TagAction: taSize; DeltaSize: -2),
                                                            (Tag: '[f+4]'; TagAction: taSize; DeltaSize: 4),
                                                            (Tag: '[f-4]'; TagAction: taSize; DeltaSize: -4),
                                                            (Tag: '[f+8]'; TagAction: taSize; DeltaSize: 8),
                                                            (Tag: '[f-8]'; TagAction: taSize; DeltaSize: -8),
                                                            (Tag: '[f+16]'; TagAction: taSize; DeltaSize: 16),
                                                            (Tag: '[f-16]'; TagAction: taSize; DeltaSize: -16));
После повторной инициализации модуля, все поля Tag становятся пустыми. Остальные поля как надо. В модуле нет никаких директив.
Жду комментарии.
ArkaNN вне форума Ответить с цитированием
Старый 26.11.2011, 18:00   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хм, действительно, даже константный массив автоматом финализируется (нахрена?). Память, естественно, не освобождается, т.к. она и не выделялась, но ссылки на строки затираются nil. Похоже, единственный выход — использовать ShortString, а чтобы каждая строка не занимала 256 байт, задайте макс. длину, например ShortString[6], благо, у вас строки короткие.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.11.2011, 18:19   #7
ArkaNN
Пользователь
 
Регистрация: 17.08.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
хм, действительно, даже константный массив автоматом финализируется (нахрена?). Память, естественно, не освобождается, т.к. она и не выделялась, но ссылки на строки затираются nil. Похоже, единственный выход — использовать ShortString, а чтобы каждая строка не занимала 256 байт, задайте макс. длину, например ShortString[6], благо, у вас строки короткие.
Спасибо! Я правда уже так и сделал, только String[6] написал. Тоже работает. Все-равно, очень неприятный глюк.
ArkaNN вне форума Ответить с цитированием
Старый 26.11.2011, 18:37   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Кстати, если string заменить на PChar, как подсказал 3D Hunter, финализация для массива не будет вызываться
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 26.11.2011 в 18:44.
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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