Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавить ресурс в запущенную программу, Чтобы можно было найти его FindResource 
:(
    Опции темы
Gwire
Дата 11.4.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Тем похожих полно. Но все они о добавлении данных в ресурс до компиляции. 
Не исключено, что есть тема котора решает мою проблему, но среди тех "похожих"... я просто устал их перечитывать.

Предисловие:
Уже разработан и "принят на вооружение" класс (TCustomFormatStr), который загружает язык интерфейса и делает он это из ресурса.
Получается так, в зависимости от того какой файл был добавлен в ресурс до компиляции такой и будет язык интерфейса проекта.
Ресурс который он ищет - "FormatStr". Просто взять и поменять эту логику я не могу.

Задача:
Сделать загрузку  язык интерфейса призапуске программы, а не в момент компиляции.
  Не добавлять файл с языком до компиляции, а держать их отдельно от программы.  [  OK  ]
  Компилировать и запустить программу                                            [  OK  ]
  Добавить ресурс "FormatStr" из файла выбранного пользователем                  [ FAIL ]

Возможно ли вообще добавлять ресурсы уже воврмя работы программы?

PM MAIL   Вверх
RomanEEP
Дата 11.4.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Думаю что изменять экзешник во время выполнения недопускается. И вообще пытаться загрузить данные в ресурсы, а потом из ресурсов считывать метод прямо говоря кривой. Гораздо лучше сделать класс TCustomFormatStr абстрактным и реализовать наследники, кот позволяют ему работать как с файлами, так и с ресурсами
PM MAIL   Вверх
Gwire
Дата 11.4.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4




Цитата(RomanEEP @  11.4.2011,  14:15 Найти цитируемый пост)
Гораздо лучше сделать класс TCustomFormatStr абстрактным 

Истинно так. Но увы я не могу менять это класс "TCustomFormatStr". Всмысле я могу - но нельзя.

А сам экзешник менять не нужно. Нужно динамически подгрузить "файл языка" в ресурс HInstance.



PM MAIL   Вверх
cat512
Дата 12.4.2011, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Как вариант использовать алгоритм packer-a/unpacker-a, но сложно всё это 

Это сообщение отредактировал(а) cat512 - 12.4.2011, 00:38
PM MAIL   Вверх
northener
Дата 12.4.2011, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Gwire @  11.4.2011,  14:49 Найти цитируемый пост)
А сам экзешник менять не нужно. Нужно динамически подгрузить "файл языка" в ресурс HInstance.


Ресурс - есть ресурс. Он существует только в файле на диске.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 12.4.2011, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Если нельзя менять только потому что во многих других местах завязано, то можно изменить минимально - добавить возможность загружать не только из своего HInstance, а из любого. Ну и сделать файлы переводов ресурсными дллками

Также можно перезаписывать ресурс в памяти, но для этого длина нового ресурса не должна превышать длины старого.

Это сообщение отредактировал(а) bems - 12.4.2011, 03:56


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 12.4.2011, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(bems @  12.4.2011,  03:55 Найти цитируемый пост)
Также можно перезаписывать ресурс в памяти, но для этого длина нового ресурса не должна превышать длины старого.

А вот тут желательно было дать либо ссылку, либо пример. Ибо мне, например, такой вариант пока не встречался.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 12.4.2011, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



northener, дам объяснение на пальцах. LockResource на самом деле возвращает указатель на ресурс, спроецированный на АП процесса вместе со всем исполняемым модулем. По этом адресу и можно перезаписать SizeofResource байт. Атрибуты защиты памяти обычно не позволяют этого сделать, поэтому нужно сперва сделать VirtualProtect этой области.
То что последовательность FindResource-LoadResource-LockResource ничего фактически не загружает, а всего лишь находит указатель на ресурс, присутствующий в АП с самой загрузки модуля, и что это всегда один и тот же указатель для одного и того же ресурса в интервале загрузка модуля-выгрузка модуля нигде не документировано, но подтверждается практикой.

Добавлено через 6 минут и 27 секунд
Не даром же в MSDN сказано что FreeResource не нужна начиная с 32хбитных винд. Во времена х16 не было раздельных адресных пространств, и так появилась такая сложная последовательность работы с ресурсами. А с появлением виртуальных АП ресурс сразу же проецируется, и пока не будет нужен может при этом отсутствовать в оперативе. Загрузку возьмет на себя механизм подкачки.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
MetalFan
Дата 12.4.2011, 12:13 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Вроде как BeginUpdateResource/EndUpdateResource позволяют менять ресурсы для НЕЗАПУЩЕННОГО исполнительного файла или dll.
Так что можно реализовать следующий вариант:
1. Необходимо заменить некий ресурс в работающем exe.
2. запускаем вспомогательное приложение, которому передаем необходимую информацию (какой ресурс на что менять, к примеру), закрываемся.
3. Вспомогательное приложение апдейтит/заменяет языковой ресурс в исходном файле (с пом.упомянутых функций) и запускает исходное приложение.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Gwire
Дата 12.4.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Цитата(bems @  12.4.2011,  03:55 Найти цитируемый пост)
сделать файлы переводов ресурсными дллками

Я уже думал над этим вариантом... Если нет механизма добавления новых ресурсов в процессе работы - то он самый приемлемый. 
Хотя я нашел 3 функции: BeginUpdateResource, UpdateResource и EndUpdateResource. Вроде в MSDN-е описано все врозумительно,
и на значение всех параметров понятно. =( но не срабатывает.

PS: Буду пока делать с dll-ками.


Добавлено через 7 минут и 6 секунд
MetalFan, прошу прощения, почему то не увидел твоего сообщения.
Теперь, после про чтения, становится ясно, что я не правильно делал. 
Я BeginUpdateResource указывал имя файла с языком, а не .exe-файл.

PM MAIL   Вверх
MetalFan
Дата 12.4.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Gwire @  12.4.2011,  12:55 Найти цитируемый пост)
но не срабатывает.

Я в свое время вполне удачно этими функциями пользовался. Все прекрасно работало.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.