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

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

Запуск приложения, хранящегося в ресурсах средствами API


YDS ©   (2006-06-09 11:08:00) 

Средствами Delphi сабж реализуется посредством конструкции вида:

Res := TResourceStream.Create(Hinstance, 'My.exe', Pchar(EXEFILE));
Res.SavetoFile('My.exe');

Однако при этом нужно подвязывать в uses Classes, что увеличивает размер конечного exe килобайт на 80.

Как это можно обойти средствами API или KOL?


YDS   (2006-06-14 20:09:00) [1]

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


YDS   (2006-06-14 20:01:00) [2]


> Вирусописатели непобедимы.


Не угадал :) Просто есть консольная тулза, которой таким образом проще добавить функциональность, сделав все при этом в виде одного exe.


RA   (2006-06-13 09:40:00) [3]

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


YDS   (2006-06-09 22:05:00) [4]

Все, разобрался. Нужно примерно так:

var
pFile, MemStrm: PStream;
cFile :string; // имя файла, в который нужно записать
mBuffer : array[0..1929] of byte;

begin
        MemStrm := NewMemoryStream;
        Resource2Stream(MemStrm,HInstance,'AD',RT_RCDATA);
        MemStrm.Position := 0;
        MemStrm.Read(mBuffer,SizeOf(mBuffer));
        SeekFileStream(pFile, 0, spEnd);
        pFile.Write(mBuffer,SizeOf(mBuffer));
        MemStrm.free;
        pFile.free;
end;


YDS   (2006-06-09 21:40:00) [5]

Sorry, но снова туплю :(

Задача стоит простая: взять содержимое ресурса из текущего файла и скопировать его в конец другого файла.
Делаю так:
var
pFile, MemStrm: PStream;
cFile :string; // имя файла, в который нужно записать
begin
MemStrm := NewMemoryStream;
Resource2Stream(MemStrm,HInstance,'AD',RT_RCDATA); // читаю ресурс

pFile := NewReadWriteFileStream(cFile); // открваю файл на запись
SeekFileStream(pFile, 0, spEnd); // прыгаю в его конец
WriteFileStream(pFile, MemStrm^, GetSizeMemStream(MemStrm)); // пишу

MemStrm.free;
pFile.free;
end;

В итоге, сначала в конец файла записываются какие-то 96 байт, а уж затем содержимое ресурса. Что тут не так?


YDS   (2006-06-09 11:46:00) [6]

Thks!!!!!


ECM   (2006-06-09 11:26:00) [7]

З.Ы. у MemoryStream есть метод SaveToFile


ECM   (2006-06-09 11:23:00) [8]


> Как это можно обойти средствами API или KOL?


1) KOL - использовать Resource2Stream:

function Resource2Stream( DestStrm : PStream; Inst : HInst;
                         ResName : PChar; ResType : PChar ): Integer;
{* Loads given resource to DestStrm. Useful for non-standard
  resources to load it into memory (use memory stream for such
  purpose). Use one of following resource types to pass as ResType:
  |<pre>
RT_ACCELERATOR Accelerator table
RT_ANICURSOR Animated cursor
RT_ANIICON Animated icon
RT_BITMAP Bitmap resource
RT_CURSOR Hardware-dependent cursor resource
RT_DIALOG Dialog box
RT_FONT         Font resource
RT_FONTDIR Font directory resource
RT_GROUP_CURSOR Hardware-independent cursor resource
RT_GROUP_ICON Hardware-independent icon resource
RT_ICON         Hardware-dependent icon resource
RT_MENU         Menu resource
RT_MESSAGETABLE Message-table entry
RT_RCDATA Application-defined resource (raw data)RT_STRING String-table entry
RT_VERSION Version resource
  |</pre>
  |<br>For example:
  !var MemStrm: PStream;
  !    JpgObj: PJpeg;
  !......
  ! MemStrm := NewMemoryStream;
  ! JpgObj := NewJpeg;
  !......
  ! Resource2Stream( MemStrm, hInstance, 'MYJPEG', RT_RCDATA );
  ! MemStrm.Position := 0;
  ! JpgObj.LoadFromStream( MemStrm );
  ! MemStrm.Free;
  !......
  }


2) API - подсмотреть реализацию функции Resource2Stream в KOL :)


Наверх

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