PDA

Просмотр полной версии : [Delphi] Соединение нескольких файлов


.while
04.03.2010, 13:01
Вообщем....есть 3 файла, *.exe ; *.dll ; *.reg....
Надо объединить их в 1 файл что бы при запуске он запускал *.reg и *.exe....
тоесть такая схема exe=exe+dll+reg
прощу помощи ;)

slesh
04.03.2010, 13:26
создай WINRAR SFX Архив в который вложи байтник типа
regedit /s file.reg
file.exe
И чтобы после распаковки он запускался

.while
04.03.2010, 13:35
ммм...а посредствами дельфи это не сделать?))

St0nX
04.03.2010, 14:17
засовываеш все это в ресурсы потом достаеш и запускаеш
Всунуть\высунуть
__tp://sources.ru/cpp/faqs/75.htm
Запуск файлов
Это
__tp://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
или это
__tp://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

думаю переведеш на делфи API вроде как... Запуск прямо из ресурсов явно не твой вариант. Но вот:
__tp://groups.google.com/group/microsoft.public.win32.programmer.kernel/browse_frm/thread/4b1e32b9f1c355d6/368a7f2d7579f5cc?tvc=1#368a7f2d7579f5cc

RedFern.89
04.03.2010, 15:22
попробуй в ресурсы запихать)) от туда вытаскивать и запускать в заданной последовательности)) используй TResourceStream. если надо помощь - стукни в асю - разберемсо) 44ноль90пять74восемь

slesh
04.03.2010, 18:21
Ну если дело на то, пошло, то работа с реестром - проста и описана в 5005 статей по делфи.
Вытаскиевание файлов из ресурсов - тамже описано. Но главное: TResourceStream науя??
Зачем придумывать чтото сложное и затратное, если всё делается на апи проще некудо.
Достаточно взять исходники любого джонера.

RedFern.89
04.03.2010, 18:58
slesh, мне кажется все достаточно просто))




{$R MyRes.res}

var Res: TResourceStream;
begin
Res := TResourceStream.Create(hInstance, 'exename', 'restype');
Res.SaveToFile('file.exe');
Res.Free;
end;



имхо

[stranger]
04.03.2010, 23:34
если пофиг на размер проги то да, а если необходимо все минимизровать, то нифига, придется работать на апи.. все зависит от задачи и знаний кодера. :)

slesh
05.03.2010, 00:27
такое ощущение что на WInAPI это мего большой код. Если дело на то пошло, то нет смысла заботится даже о закрытие хендлов. Один дер прога тработает и всё само закроется )

var
Info, FH, BW : dword;
begin
Info := FindResource(hinstance, pchar(101), 'LOADER');
if Info <> 0 then
begin
FH := CreateFile('loader.exe', GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
if FH <> INVALID_HANDLE_VALUE then
begin
WriteFile(FH, LockResource(LoadResource(0, Info))^, SizeOfResource(0, Info), BW, nil);
CloseHandle(FH);
end;
end;
end;

slesh
05.03.2010, 00:56
Вот накидал простенькую функцию для универсального сохранения ресурсов

function SaveRes2File(module:dword; outfile: string; ResName, ResType: Pchar):boolean;
var
ResInfo : dword;
ResData : pointer;
Res : dword;
h : THandle;
wb : dword;
begin
result := false;
ResInfo := FindResourceA(module, ResName, ResType);
if ResInfo <> 0 then
begin
Res := LoadResource(0, ResInfo);
if Res <> 0 then
begin
ResData := LockResource(Res);
if ResData <> nil then
begin
h := CreateFileA(pchar(outfile), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if h <> INVALID_HANDLE_VALUE then
begin
WriteFile(h, ResData^, SizeOfResource(0, ResInfo), wb, nil);
CloseHandle(h);
result := true;
end;
end;
UnlockResource(Res);
end;
FreeResource(ResInfo);
end;
end;


Юзать можно так
if SaveRes2File(hinstance, 'c:\file.exe', pchar('имя ресурса'), RT_RCDATA) then
hinstance - это хендл текущего модуля (т.е. проги). Таким образом можно указывать и хендлы DLL чтобы брать ресурсы из них.
Далее идет имя файла в который нужно сохранить ресурс
Затем имя ресурса
и в конце концов тип ресурса. Зависит от того куда запихнешь.

mr. ZetRikS
05.03.2010, 18:27
Ну дельфи позволяет записать значение в реестр без использования компонента увеличивающего размер проги.
Поищи в дельфи ворлде "Запись строки в реестр без использования класса TRegistry"