Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Доступ к ресурсам [D7, XP]


Познающий ©   (2007-02-20 15:44:00) 

Подскажите пожалуйста господа специалисты,
есть у меня процедурка, которая читает текстовый файл из ресурса самой проги. Мне необходимо в другой процедурке при необходимости произвести коррекцию текста и сохранить в ресурсах уже изменённый вариант. Извращение? наверное, но так нужно.
Читать из ресурса я могу. Вот как бы сохранить опять там же, учитывая что размер останентся тот же?
По идее это же где-то в памяти находится.
Может как-то можно узнать адрес и работать с участком памяти где находится нужный мне ресурс?
Я пока плаваю, извините если криво вопрос поставил.
Помогите хоть идеями, так как наврядли кто-то так извращался.


koha   (2007-02-20 20:51:00) [1]

Не знаю даже возможно ли это стандартными средствами, TResourceStream.Write Объявлена так:

function TResourceStream.Write(const Buffer; Count: Longint): Longint;
begin
 raise EStreamError.CreateRes(@SCantWriteResourceStreamError);
end;


Но если перенаследовать класс и перекрыть эту процедуру своей то впринципе можно и добиться результата. TResourceStream он потомок TCustomMemoryStream - а у этот и как читает так и пишет в памать.
А еще стоит в процедуру инициализации заглянуть в общем там тоже может что переделыввать нужно будет.


Познающий   (2007-02-20 20:05:00) [2]

Я так понимаю создастся отдельный поток с данным ресурсом, а мне нужно изменить ресурс в памяти самой проги, что бы далее другие вызовы TResourceStream.create(hinstance, 'test.txt', RT_RCDATA) уже читали мои изменённые данные.
Суть в том, что посторонний человек пишет прогу, которая работает с данными в ресурсе. Мне нужно написать только процедуру, которую он добавит на создание формы, которая проверит регистрацию и если всё гуд, то расшифрует данные, находящиеся в ресурсе, с которыми он сам будет дальше работать через TResourceStream.create
Мне было бы проще самому переписать его прогу и забыть про это, но парень молодой, пусть сам учится и хвастается перед своими друзьями, мне только вот нужно помочь с этим детским вариантом декриптора, а сам только по базам данным что-то волоку.


koha   (2007-02-20 18:48:00) [3]

- Так то есть клыссы которые работают с ресурсами:
 TResourceStream, function FindResource, TResHeader


Познающий   (2007-02-20 18:13:00) [4]

procedure workResource(myOffset: DWord);
begin
  // Как на паскале это будет выглядеть?
end;

begin
  workResource(Как узнать адрес нужного ресурса);
end;

2koha ©
а Вам бы посоветовал если отсутствует желание помогать другим просто хотя бы не отвечать

Я бы написал на паскале если бы знал как.
Для меня первое узнать адрес.
Процедуру уже бы сам вычислял как написать.


koha   (2007-02-20 17:47:00) [5]

- я так думаю ИХМО, что тебе надо туда, где "кодеры-ковбои пасут на лугах mikrosoft священных коров говорящих на асемблере"


Познающий   (2007-02-20 17:41:00) [6]

да я не про то.
написал как попало побыстрей что бы понятно было.
я же в своей же проге это
делаю, причем тут кулхацкеры...

прога у меня на дельфях, кусок кривого асма для примера.
ну так можно или нет?
чирканите пару строчек если не в лом, или пол дня вас упрашивать поделиться знанием ;)


koha   (2007-02-20 17:18:00) [7]

> Познающий   (20.02.07 17:06) [10]
 
- Однако тебе на другой форум нужно.


Сергей М.   (2007-02-20 17:16:00) [8]

Кулхацкер ?)


> mov si


Ты вообще в курсе, что ВАП прикладного процесса в Win32 - 32-хразрядное ?


Познающий   (2007-02-20 17:06:00) [9]

2Сергей М.
Так мне и нужно в памяти модифицировать когда прога загружена.
Как узнать адрес где ресурс находится?

что бы потом типа такого:

asm
mov si, offset resource
mov cx, 1024
m1:
xor byte ptr [si + cx], $f0
loop m1
end;


Сергей М.   (2007-02-20 16:48:00) [10]


> А как не документированными способами?


А никак не надо.
Ты рискуешь быть битым табуреткой от рук юзеров твоей программы, когда она в одночасье рухнет из-за использования недокументированных возможностей ОС.


> узнать адрес в памяти где находится нужный ресурс и модифицировать
> его


В памяти модифицируй себе сколько угодно.
А в соотв. файлемодифицировать оные же документированными способами запрещено.


Elen   (2007-02-20 16:45:00) [11]


> но разве настолько тяжело узнать адрес в памяти где находится
> нужный ресурс и модифицировать его?

Нет, но НАФИГА???? Задача какая?


Познающий   (2007-02-20 16:44:00) [12]

2Сергей М.
Почти так и есть.
В своей же проге при её загрузке модифицировать вложенный в неё ресурс.
А как не документированными способами?
Извините, я пока плохо разбираюсь, но разве настолько тяжело узнать адрес в памяти где находится нужный ресурс и модифицировать его?


Сергей М.   (2007-02-20 16:32:00) [13]


> Elen ©   (20.02.07 16:25) [5]


Он хочет запустить свою "прогу" и, наплевав на документированную невозможность модификации файла соотв. РЕ-модуля, изменить в этом файле секцию, содержащую ресурсы оного модуля.


Elen   (2007-02-20 16:25:00) [14]


> Познающий   (20.02.07 16:20) [2]

Так подожди ты хочеш вытянуть из проги ресурс не запуская ее?


Elen   (2007-02-20 16:24:00) [15]


> Познающий   (20.02.07 16:20) [2]

Ну тогда сделай обмен между прогами (например через сокеты - лично мое мнение это особенно удобно)


> Нет, мне именно так нужно.

Это не ответ. Один и тот же результат можно получить разными способами, и лучше выбирать из них более подходящие для обстановки. Может твое решение не единственное тебе подходящее.


Сергей М.   (2007-02-20 16:23:00) [16]


> Познающий   (20.02.07 15:44)


Документированными способами задача не реализуема.


Познающий   (2007-02-20 16:20:00) [17]

Нет, мне именно так нужно.
В том-то и дело.
Я бы кучу красивых других вариантов нашол бы,
но есть условие работы только с ресурсами проги.
Мне нужно написать только процедурку зная название ресурса и всё.
Процедура должна только расшифровать текстовый ресурс для дальнейшего нормального его использования.
Да, криво, боком ну так хотят.
А для меня просто стало интересно как можно это реализовать.


Elen   (2007-02-20 16:01:00) [18]


> Познающий   (20.02.07 15:44)

А зачем запихивать файл в ресурсы? оставь его рядом с прогой. Или напиши процедуру, которая будет передавать содержимое этого файла другой проге например через MapFiles


Наверх

Титульная страница Поиск, карта сайта Написать письмо