Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Ресурсы   Найти похожие ветки 

 
agMuH   (2004-07-07 01:32) [0]

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


 
MIGUR   (2004-07-07 02:18) [1]

Из своей проги наверное нельза, а так используй restorator или что иное.


 
agMuH   (2004-07-07 02:25) [2]

как это нельзя вот нашел но разобраться не могу может поможите

Иногда возникает необходимость вшить ресурсы в исполняемый файл Вашего приложения (например чтобы предотвратить их случайное удаление пользователем, либо, чтобы защитить их от изменений). Данный пример показывает как вшить любой файл как ресурс в EXE-шнике.

Далее рассмотрим, как создать файл ресурсов, содержащий корию какого-либо файла. После создания такого файла его можно легко прицепить к Вашему проекту директивой {$R}. Файл ресурсов, который мы будем создавать имеет следующий формат:
заголовок
заголовок для нашего RCDATA ресурса
собственно данные - RCDATA ресурс

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

Заголовок ресурса выглядит следующим образом:

TResHeader = record
 DataSize: DWORD;        // размер данных
 HeaderSize: DWORD;      // размер этой записи
 ResType: DWORD;         // нижнее слово = $FFFF => ordinal
 ResId: DWORD;           // нижнее слово = $FFFF => ordinal
 DataVersion: DWORD;     // *
 MemoryFlags: WORD;
 LanguageId: WORD;       // *
 Version: DWORD;         // *
 Characteristics: DWORD; // *
end;

Поля помеченны звёздочкой Мы не будем использовать.

Приведённый код создаёт файл ресурсов и копирует его в данный файл:

procedure CreateResourceFile(
 DataFile, ResFile: string; // имена файлов
 ResID: Integer // id ресурсов
 );
var
 FS, RS: TFileStream;
 FileHeader, ResHeader: TResHeader;
 Padding: array [0..SizeOf(DWORD)-1] of Byte;
begin

 { Open input file and create resource file }
 FS := TFileStream.Create( // для чтения данных из файла
 DataFile, fmOpenRead);
 RS := TFileStream.Create( // для записи файла ресурсов
 ResFile, fmCreate);

 { Создаём заголовок файла ресурсов - все нули, за исключением
 HeaderSize, ResType и ResID }
 FillChar(FileHeader, SizeOf(FileHeader), #0);
 FileHeader.HeaderSize := SizeOf(FileHeader);
 FileHeader.ResId := $0000FFFF;
 FileHeader.ResType := $0000FFFF;

 { Создаём заголовок данных для RC_DATA файла
 Внимание: для создания более одного ресурса необходимо
 повторить следующий процесс, используя каждый раз различные
 ID ресурсов }
 FillChar(ResHeader, SizeOf(ResHeader), #0);
 ResHeader.HeaderSize := SizeOf(ResHeader);
 // id ресурса - FFFF означает "не строка!"
 ResHeader.ResId := $0000FFFF or (ResId shl 16);
 // тип ресурса - RT_RCDATA (from Windows unit)
 ResHeader.ResType := $0000FFFF
 or (WORD(RT_RCDATA) shl 16);
 // размер данных - есть размер файла
 ResHeader.DataSize := FS.Size;
 // Устанавливаем необходимые флаги памяти
 ResHeader.MemoryFlags := $0030;

 { Записываем заголовки в файл ресурсов }
 RS.WriteBuffer(FileHeader, sizeof(FileHeader));
 RS.WriteBuffer(ResHeader, sizeof(ResHeader));

 { Копируем файл в ресурс }
 RS.CopyFrom(FS, FS.Size);

 { Pad data out to DWORD boundary - any old
 rubbish will do!}
 if FS.Size mod SizeOf(DWORD) <> 0 then
   RS.WriteBuffer(Padding, SizeOf(DWORD) -
   FS.Size mod SizeOf(DWORD));

 { закрываем файлы }
 FS.Free;
 RS.Free;
end;

Данный код не совсем красив, и отсутствует обработка ошибок. Правильнее будет создать класс, включающий в себя данный пример.

Извлечение ресурсов из EXE

теперь рассмотрим пример, показывающий, как извлекать ресурсы из исполняемого модуля.

Вся процедура заключается в создании потока ресурса, создании файлового потока и копировании из потока ресурса в поток файла.

procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType, FileName:string);
var
 ResStream: TResourceStream;
 FileStream: TFileStream;
begin
 try
   ResStream := TResourceStream.CreateFromID(Instance, ResID, pChar(ResType));
   try
     //if FileExists(FileName) then
     //DeleteFile(pChar(FileName));
     FileStream := TFileStream.Create(FileName, fmCreate);
     try
       FileStream.CopyFrom(ResStream, 0);
     finally
       FileStream.Free;
     end;
   finally
     ResStream.Free;
   end;
 except
   on E:Exception do
   begin
     DeleteFile(FileName);
     raise;
   end;
 end;
end;

Всё, что требуется, это получить Instance exe-шника или dll (у Вашего приложения это Application.Instance или Application.Handle, для dll Вам придётся получить его самостоятельно :)
ResID
тот же самый ID , который был присвоен ресурсу
ResType: WAVEFILE, BITMAP, CURSOR, CUSTOM
это типы ресурсов, с которыми возможно работать, но у меня получилось успешно проделать процедуру только с CUSTOM
FileName
это имя файла, который мы хотим создать из ресурса


 
MIGUR   (2004-07-07 02:42) [3]

В чём разобраться неможеш.
Кстати что то похожее описано в ХАКЕРЕ №03 март 2004.



Страницы: 1 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
4-1086339528
SigalX
2004-06-04 12:58
2004.07.18
Смена активного привода CD


3-1087986820
Piter
2004-06-23 14:33
2004.07.18
Перенос данных из одной базы в другую


1-1089203162
isma666
2004-07-07 16:26
2004.07.18
Не активное приложение


14-1088680831
ricks
2004-07-01 15:20
2004.07.18
Помогите найти музыку


3-1087782709
КлякСа
2004-06-21 05:51
2004.07.18
СУБД &amp; Delphi, клиент-сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский