![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
Тем похожих полно. Но все они о добавлении данных в ресурс до компиляции.
Не исключено, что есть тема котора решает мою проблему, но среди тех "похожих"... я просто устал их перечитывать. Предисловие: Уже разработан и "принят на вооружение" класс (TCustomFormatStr), который загружает язык интерфейса и делает он это из ресурса. Получается так, в зависимости от того какой файл был добавлен в ресурс до компиляции такой и будет язык интерфейса проекта. Ресурс который он ищет - "FormatStr". Просто взять и поменять эту логику я не могу. Задача: Сделать загрузку язык интерфейса призапуске программы, а не в момент компиляции. Не добавлять файл с языком до компиляции, а держать их отдельно от программы. [ OK ] Компилировать и запустить программу [ OK ] Добавить ресурс "FormatStr" из файла выбранного пользователем [ FAIL ] Возможно ли вообще добавлять ресурсы уже воврмя работы программы? |
|||
|
||||
RomanEEP |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
Думаю что изменять экзешник во время выполнения недопускается. И вообще пытаться загрузить данные в ресурсы, а потом из ресурсов считывать метод прямо говоря кривой. Гораздо лучше сделать класс TCustomFormatStr абстрактным и реализовать наследники, кот позволяют ему работать как с файлами, так и с ресурсами
|
|||
|
||||
Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
||||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
Как вариант использовать алгоритм packer-a/unpacker-a, но сложно всё это
Это сообщение отредактировал(а) cat512 - 12.4.2011, 00:38 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
Ресурс - есть ресурс. Он существует только в файле на диске. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Если нельзя менять только потому что во многих других местах завязано, то можно изменить минимально - добавить возможность загружать не только из своего HInstance, а из любого. Ну и сделать файлы переводов ресурсными дллками
Также можно перезаписывать ресурс в памяти, но для этого длина нового ресурса не должна превышать длины старого. Это сообщение отредактировал(а) bems - 12.4.2011, 03:56 -------------------- Обижено школьников: 8 |
|||
|
||||
northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
А вот тут желательно было дать либо ссылку, либо пример. Ибо мне, например, такой вариант пока не встречался. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
northener, дам объяснение на пальцах. LockResource на самом деле возвращает указатель на ресурс, спроецированный на АП процесса вместе со всем исполняемым модулем. По этом адресу и можно перезаписать SizeofResource байт. Атрибуты защиты памяти обычно не позволяют этого сделать, поэтому нужно сперва сделать VirtualProtect этой области.
То что последовательность FindResource-LoadResource-LockResource ничего фактически не загружает, а всего лишь находит указатель на ресурс, присутствующий в АП с самой загрузки модуля, и что это всегда один и тот же указатель для одного и того же ресурса в интервале загрузка модуля-выгрузка модуля нигде не документировано, но подтверждается практикой. Добавлено через 6 минут и 27 секунд Не даром же в MSDN сказано что FreeResource не нужна начиная с 32хбитных винд. Во времена х16 не было раздельных адресных пространств, и так появилась такая сложная последовательность работы с ресурсами. А с появлением виртуальных АП ресурс сразу же проецируется, и пока не будет нужен может при этом отсутствовать в оперативе. Загрузку возьмет на себя механизм подкачки. -------------------- Обижено школьников: 8 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Вроде как BeginUpdateResource/EndUpdateResource позволяют менять ресурсы для НЕЗАПУЩЕННОГО исполнительного файла или dll.
Так что можно реализовать следующий вариант: 1. Необходимо заменить некий ресурс в работающем exe. 2. запускаем вспомогательное приложение, которому передаем необходимую информацию (какой ресурс на что менять, к примеру), закрываемся. 3. Вспомогательное приложение апдейтит/заменяет языковой ресурс в исходном файле (с пом.упомянутых функций) и запускает исходное приложение. -------------------- There are always someone smarter than you... |
|||
|
||||
Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
Я уже думал над этим вариантом... Если нет механизма добавления новых ресурсов в процессе работы - то он самый приемлемый. Хотя я нашел 3 функции: BeginUpdateResource, UpdateResource и EndUpdateResource. Вроде в MSDN-е описано все врозумительно, и на значение всех параметров понятно. =( но не срабатывает. PS: Буду пока делать с dll-ками. Добавлено через 7 минут и 6 секунд MetalFan, прошу прощения, почему то не увидел твоего сообщения. Теперь, после про чтения, становится ясно, что я не правильно делал. Я BeginUpdateResource указывал имя файла с языком, а не .exe-файл. |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Я в свое время вполне удачно этими функциями пользовался. Все прекрасно работало. -------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |