Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как вставить в ресурсы чюжово файла exe фаил?


Автор: Ak47black 23.1.2006, 20:09
Привет всем.
Сталкнулся с проблемой - как вставить в ресурсы чюжово файла exe фаил или поменять там уже сушествуюший exe.
Подскажите как реализовать.

Автор: _hunter 23.1.2006, 20:12
тебе это самому сделать нужно ( своей программой ) или любая подойдет?

P.S.
ты в курсе что этот вставленный exe-шник запускаться всеравно не будет?

Автор: sergejzr 23.1.2006, 20:13
Цель?

Автор: Ak47black 23.1.2006, 21:16
Мне просто нужно поменять exe ресурс на свой exe ресурс , (запуск ненужен); smile При помоши своёй проги.

Автор: Snowy 24.1.2006, 10:30
тебе уже в готовую программу запихивать нужно, или на стадии компиляции?

Автор: Ak47black 24.1.2006, 10:36
Цитата(Snowy @ 24.1.2006, 10:30)
тебе уже в готовую программу запихивать нужно, или на стадии компиляции?

В уже скомпилированный фаил который на harde валяется. smile

Автор: MIX55 24.1.2006, 11:47
вот раз
"Пакер"
вот два
"Анпакер"

Модератор: Вырезано, как мусор

Автор: Snowy 24.1.2006, 11:53
 Ну не нужно постить сюда всякую псевдо XAKEPCKYI0 ерунду.
Только лишнее доказательтво ламерства псевдокодеров журнала "хакер".
 Добавлено @ 11:55 
Вот, нарисовал код.
Добавляет ресурсы в существующий exe и т.п. файл, который может содержать ресурсы.
Пример добавляет данные в RC_DATA для русского языка. Но можно модифицировать под другие нужды.
Код

function AddResource(FileName, ResName: string; Buf: pointer; Size: integer): integer;
{* Добавляет данные в RC_DATA. На входе:
   FileName - имя файла с ресурсами (exe, dll и т.п),
   ResName  - имя ресурса (ОБЯЗАТЕЛЬНО! заглавными латинскими буквами),
   Buf      - указатель на блок данных, Size - размер блока данных.
   На выходе - 0, если все Ok, либо номер ошибки Windows }
var
  Hnd: THandle;
begin
  Hnd := BeginUpdateResource(PChar(FileName), false);
  if Hnd=0 then begin
    result := GetLastError; Exit;
  end;
  if UpdateResource(Hnd, RT_RCDATA, PChar(ResName), 1049, Buf, Size) then
    result := 0
  else result := GetLastError;
  EndUpdateResource(Hnd, (result<>0));
end;

function AddFileToExe(ExeName, FileName, ResName: string): boolean;
{* Добавляет любой файл в ресурсы. На входе:
   ExeName  - Путь к файлу с ресурсами,
   FileName - Путь к файлу, который запихнуть в ресурсы,
   ResName  - Под каким именем сохранить в ресурсах. ОБЯЗАТЕЛЬНО! заглавные латинские }
var
  fs: TFileStream;
  b:  pointer;
begin
  try
    fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    GetMem(b, fs.Size);
    fs.Read(b^, fs.Size);
    result := AddResource(ExeName, ResName, b, fs.Size)=0;
    fs.Free;
    FreeMem(b);
  except
    result := false;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
{* Пример использования.}
begin
  if AddFileToExe('C:\1.exe','C:\2.exe', 'NEWEXERES') then
    ShowMessage('Готово')
  else ShowMessage('Не получилось');
end;

 Добавлено @ 11:58 
P.S. Чтобы постить для других языков, нужно заменить 1049 на код другого языка, или заменить на 0.
Чтобы постить в другую секцию, замените соответственно RC_DATA на нужную вам.
В примере RC_DATA, т.к. туда кладется все, что не типизировано (т.е. не картинки, ни иконки и т.п.)
 

Автор: Ak47black 24.1.2006, 18:38
Snowy - спасибо за ЕДИНСТВЕННЫЙ норм ответ. smile

Автор: Alex 25.1.2006, 02:27
Snowy, все хорошо, только есть два ньюанса:
1. Функция UpdateResource есть только в NT системах, а у нас к сожелению еще не мало машин с 9x системами
2. Не знаю как на счет ресурсов типа RS_DATA, но с ресурсами типа RS_ICON UpdateResource работала ужасно (последний раз проверял около года назад)

Что бы всего этого избежать и пришлось мне в свое время писать модуль http://vingrad.ru/DELPHI-SRC-000003
Добавлено @ 02:32
Описание модуля и примеры работы так же есть вот в этой теме http://forum.vingrad.ru/index.php?showtopic=21183&st=0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)