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