В сети уже имеется инструкция по созданию билдера (builder) на Delphi, рассказывающая, как изменять код готовой программы. Там применяют поиск нужного текста в WinHex, высчитывание байтов и т.д. Я покажу, как всё сделать проще и быстрее. А раз быстрее, то сделаю еще и извлечение файла, который буду изменять, из программы-билдера.
Первым делом надо создать программу, код которой будем менять. Программа максимально простая: форма с меткой (Label). Метка — ссылка, по клике на нее в браузере будет открываться страница. Вот адрес этой страницы (а соответственно и отображение метки) будем менять.
Итак, код этой программы:
procedure TForm1.FormCreate(Sender: TObject); var url:string; i:integer; begin url:='????????????????????????'; i:=length(url); while url[i]='?' do begin delete(url, length(url), 1); dec(i); end; Label1.caption:=url; end; procedure TForm1.Label1Click(Sender: TObject); begin ShellExecute(0, 'open', PChar(Label1.caption), nil, nil, SW_SHOW); end;
Переменная url имеет значение «много вопросительных знаков«, которое и нужно менять на нужную ссылку. Замечу, что длина строки url (количество знаков) должна быть не меньше длины ссылки, на которую мы будем менять.
Т.к. длина ссылки будет не больше установленной длины url (в данном случае — 24), то в конце останутся лишние вопросительные знаки, которые нужно обрезать, что и делает цикл while. После цикла отображаем в Label текст ссылки.
А по клику на Label открываем ссылку в браузере. Для использования ShellExecute необходимо вuses добавить модуль ShellApi.
После создания и компилирования программы её нужно компилировать в ресурс. Для этого будет нужен файл brcc32.exe, который находится в каталоге bin каталога Delphi (его можно без проблем скопировать в любую удобную вам папку). А также файл со списком ресурсов (в данном случае одним ресурсом) с расширением «rc» (например, File.rc). Создаем такой файл и записываем в него:
FILE1 EXEFILE C:\Project1.exe
Где C:\Project1.exe — путь к первой скомпилированной программе.
Теперь компилируем. Либо в проводнике переносим файл File.rc на brcc32.exe, либо запускаем командную строку и выполняем команду: «brcc32 File.rc» (файл brcc32.exe конечно должен быть в текущем каталоге).
В результате в папке появится файл FILE.RES. Его переносим в новую папку, где будет наш проект билдера.
Теперь создаем непосредственно программу-билдер. На форму кидаем кнопку (Button), поле для ввода (Edit) и метку (Label).
После implementation добавляем строку:
{$R FILE.RES}
И код кнопки:
procedure TForm1.Button1Click(Sender: TObject); var ResStream: TResourceStream; FileName, oldstring, newstring, s: string; f: file; l: Longint; go:boolean; begin label1.caption:='wait'; Application.ProcessMessages; FileName := 'pr.exe'; ResStream:=TResourceStream.Create(HInstance,'FILE1','EXEFILE'); ResStream.SaveToFile(ExtractFilePath(Application.ExeName)+FileName); ResStream.Free; oldstring := '????????????????????????'; newstring := Edit1.Text; s := oldstring; AssignFile(f, FileName); Reset(f, 2); l:=0; go:=true; while (l<=(FileSize(f) - Length(oldstring) - 1)) and go do begin Seek(f, l); BlockRead(f, oldstring[1], Length(oldstring)); if oldstring = s then begin seek(f, l); BlockWrite(f, newstring[1], Length(newstring)); go:=false; end; inc(l); end; CloseFile(f); label1.caption:='ok'; end;
Немного комментариев:
— определяем имя создаваемого файла и присваиваем label1 значение «wait»
— распаковываем файл из ресурса и сохраняем под именем «pr.exe»
— «oldstring» — строка, которую ищем в созданном файле (она там точно есть)))
— «newstring» — строка, на которую заменяем знаки вопроса
— открываем файл как двоичный для записи в него (Reset(f, 2);) (одну запись определяем как два байта)
— в цикле считываем из файла байты (BlockRead) и при нахождении нужной строки записываем в это место новый текст (BlockWrite)
— закрываем файл и присваиваем label1 значение «ok«
Теперь запускаем билдер, вводим адрес, нажимаем кнопку.
В результате получаем файл pr.exe:
И по клике на метку, происходит переход по ссылке))
Это не билдер. Эта программа просто компилирует ресурс в приложение и ищет нужные байты.
ЭТО НЕ БИЛДЕР
Это компилятор ресурсов
RE:Добрый-добрый блог | Delphi. Создаем билдер (builder) Валок Vaderstad Правдинск