![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к ресурсам [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