Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание компилятора в Delphi 
:(
    Опции темы
blablabla
Дата 7.9.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Всем здрасте.......
У меня такой вопросс. 
Можно ли в DELPHI создать собственный компилятор? Если да, то дайте пожалуста ссылочку где можно почитать об этом. 

Заранее спасибо.
PM MAIL   Вверх
Vit
Дата 7.9.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Можно, ибо сам Дельфи написан на Дельфи. Других компилляторов не встречал, хотя интерпретаторов как грязи....


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
blablabla
Дата 7.9.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Цитата(Vit @ 7.9.2006,  22:46)
Можно, ибо сам Дельфи написан на Дельфи. Других компилляторов не встречал, хотя интерпретаторов как грязи....

Ясно. Но как это можно сделать. Есть хоть немного информации об этом?
PM MAIL   Вверх
Alexeis
Дата 7.9.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



У меня есть две книги
1)простая (примеры на паскале) без сложной теории и пр. называется "Пишем компилятор.pdf" (1,5мб)
2)Теоретизрованая и более сложная и полная с примерами на делфи и С 
"Компиляторы. Принципы, технологии, инструменты.djvu"(5,5мб)

Если нужно, то я выкладываю.
p.s. тема скорее из раздела поиск литературы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 7.9.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Ладно, наверное это глобальный вопросс. 
Дам конкретную задачу. 
К примеру мне нужна прога, в которой я бы мог выбрать рисунок, а затем нажать кнопку пуск. Далее создавался бы ris.exe при запуске которого в окне програмы ris отражался бы выбранный мной рисунок.

Добавлено @ 23:01 
Цитата(alexeis1 @ 7.9.2006,  22:58)
У меня есть две книги
1)простая (примеры на паскале) без сложной теории и пр. называется "Пишем компилятор.pdf" (1,5мб)
2)Теоретизрованая и более сложная и полная с примерами на делфи и С 
"Компиляторы. Принципы, технологии, инструменты.djvu"(5,5мб)

Если нужно, то я выкладываю.
p.s. тема скорее из раздела поиск литературы.

Спасибо большое.
PM MAIL   Вверх
Alexeis
Дата 7.9.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



blablabla, так для этого компилятор не нужен. Нужно просто иметь заготовку программы ris.exe и внедрять в нее новые ресурсы, а она сама будет уже определять что за ресурс у нее и соответствено грузить его. 
А можно использовать компилятор Delphi DCC32.EXE и компилятор ресурсов BRCC32.exe. Они оба консольные. Сначала запустить первый с командной строкой и получить ресурс, затем исходник на паскале скомпилировать при помощи DCC32.EXE с этим ресурсом и получить EXE.

Добавлено @ 23:16 
Первая книга уже закачалась
http://alexei-s1.narod.ru/books/pishem_compilator.pdf


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 8.9.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



alexeis1, с идеей на счёт ресурсов я понял. Но мне нужен один файл ris.exe в котором уже в скомпилированном виде будет находится мой рисунок.
PM MAIL   Вверх
Alexeis
Дата 8.9.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Ну так ресурс же и хранится в скомпилированном виде внутри одного единственого экзешника, его можно туда внедрять не компилируя заново экзешник, например так как это делает restorator, либо перекомпилируя заново, но это только если увеличение размера продукта на пару мегабайт не существенно. Все это будет выглядеть как один ris.exe


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 8.9.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



alexeis1, спасибо огромное. Тогда я наверное не правельно понял про ресурсы. Теперь буду изучать работу с ресурсами. Есть ли у тебя что нибудь про это?
PM MAIL   Вверх
Alexeis
Дата 8.9.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function AddResource(FileName, ResName: string; Buf: pointer; Size: integer): integer;    
{* Добавляет данные в RC_DATA. На входе:    
   FileName - имя файла с ресурсами (exe, dll и т.п),    
   ResName  - имя ресурса (ОБЯЗАТЕЛЬНО! заглавными латинскими буквами),    
   Buf      - указатель на блок данных, Size - размер блока данных.    
   На выходе - 0, если все Ok, либо номер ошибки Windows }    
var    
  Hnd: THandle;    
begin    
  Hnd := BeginUpdateResource(PChar(FileName), false);    
  if Hnd=0 then begin    
    result := GetLastError; Exit;    
  end;    
  if UpdateResource(Hnd, RT_RCDATA, PChar(ResName), 1049, Buf, Size) then    
    result := 0    
  else result := GetLastError;    
  EndUpdateResource(Hnd, (result<>0));    
end;

function AddFileToExe(ExeName, FileName, ResName: string): boolean;    
{* Добавляет любой файл в ресурсы. На входе:    
   ExeName  - Путь к файлу с ресурсами,    
   FileName - Путь к файлу, который запихнуть в ресурсы,    
   ResName  - Под каким именем сохранить в ресурсах. ОБЯЗАТЕЛЬНО! заглавные латинские }    
var    
  fs: TFileStream;    
  b:  pointer;    
begin    
  try    
    fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);    
    GetMem(b, fs.Size);    
    fs.Read(b, fs.Size);    
    result := AddResource(ExeName, ResName, b, fs.Size)=0;    
    fs.Free;    
    FreeMem(b);    
  except    
    result := false;    
  end;    
end;

procedure TForm1.Button1Click(Sender: TObject);    
{* Пример использования.}    
begin    
  if AddFileToExe('C:\1.exe','C:\2.exe', 'NEWEXERES') then    
    ShowMessage('Готово')    
  else ShowMessage('Не получилось');    
end;

end.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 9.9.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



alexeis1. Как добавлять ресурсы ясно, но как в самой программе их использовать???
PM MAIL   Вверх
Voyager
Дата 10.9.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



alexeis1
А вторую книгу закачаешь?smile
PM   Вверх
Alexeis
Дата 10.9.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Voyager, да я закачал сразу одновременно с первой, но поскольку тут оно получается уже не по теме я  ссылку не оставил.

Если кому надо то вот
http://alexei-s1.narod.ru/books/kompil_pri...nolog.part1.rar
http://alexei-s1.narod.ru/books/kompil_pri...nolog.part2.rar

Нород запрещает закачку более 5Мб, потому архив разбил на две части.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 10.9.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



blablabla, вот пример загрузки из ресурса, но только он здесь не внедренный из вне, а прилинкованый при компиляции, но разница только в стоке {$R bmp.res}, которая линкует ресурс при создании Exe.
Код

implementation

{$R *.dfm}

{$R bmp.res}

procedure TForm1.Button1Click(Sender: TObject);
begin
  image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'BMP1');
end;


пример целиком с ресурсом можно скачать отсюда
Пример


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 10.9.2006, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



alexeis1. А как создать сам ресурс???
PM MAIL   Вверх
Alexeis
Дата 10.9.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



в папке bin delphi есть консольная прога brcc32.exe  (она маленькая очень)
В командной строке надо указать имя rc файла описывающего ресурс (обычно там название секции  пробел название ресурса пробел путь к ресурсу на диске). И еще необязательные дополнительные параметры типа название выходного файла *.res и путь к нему. Все это можно узнать запустив в CMD 
стоку brcc32.exe (она раскажет обо всех параметрах). Этот компилятор ресурсов придется за собой таскать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 12.9.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Цитата(alexeis1 @ 8.9.2006,  23:11)
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function AddResource(FileName, ResName: string; Buf: pointer; Size: integer): integer;    
{* Добавляет данные в RC_DATA. На входе:    
   FileName - имя файла с ресурсами (exe, dll и т.п),    
   ResName  - имя ресурса (ОБЯЗАТЕЛЬНО! заглавными латинскими буквами),    
   Buf      - указатель на блок данных, Size - размер блока данных.    
   На выходе - 0, если все Ok, либо номер ошибки Windows }    
var    
  Hnd: THandle;    
begin    
  Hnd := BeginUpdateResource(PChar(FileName), false);    
  if Hnd=0 then begin    
    result := GetLastError; Exit;    
  end;    
  if UpdateResource(Hnd, RT_RCDATA, PChar(ResName), 1049, Buf, Size) then    
    result := 0    
  else result := GetLastError;    
  EndUpdateResource(Hnd, (result<>0));    
end;

function AddFileToExe(ExeName, FileName, ResName: string): boolean;    
{* Добавляет любой файл в ресурсы. На входе:    
   ExeName  - Путь к файлу с ресурсами,    
   FileName - Путь к файлу, который запихнуть в ресурсы,    
   ResName  - Под каким именем сохранить в ресурсах. ОБЯЗАТЕЛЬНО! заглавные латинские }    
var    
  fs: TFileStream;    
  b:  pointer;    
begin    
  try    
    fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);    
    GetMem(b, fs.Size);    
    fs.Read(b, fs.Size);    
    result := AddResource(ExeName, ResName, b, fs.Size)=0;    
    fs.Free;    
    FreeMem(b);    
  except    
    result := false;    
  end;    
end;

procedure TForm1.Button1Click(Sender: TObject);    
{* Пример использования.}    
begin    
  if AddFileToExe('C:\1.exe','C:\2.exe', 'NEWEXERES') then    
    ShowMessage('Готово')    
  else ShowMessage('Не получилось');    
end;

end.

alexeis1, код который ты привёл не срабатывает. Ты его сам пробывал?
PM MAIL   Вверх
Alexeis
Дата 12.9.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



blablabla, странно у меня все отлично сработало... 
Просто это пример как exe поместь в раздел RCDATA, а не картинку в раздел BITMAP

Я уже подзабыл как работает этот примерчик, оказывается и res файл компилровать даже не надо. Просто указать имя файла и ресурса.

Для тех кому сильно лень разбиратся в коде привожу уже совсем готовый пример с исходниками. Где програмка test.exe выдает ошибку о том что ресурс не найден, а когда запускается patch.exe и внедряет в него картинку jpeg, то при повторном запуске все уже срабатывает и картинка появляется на форме.
Файл "копия test.exe" - резервная копия test.exe, добавил так как после патча уже не остается оригинала (test.exe).

http://alexei-s1.narod.ru/Samples/10.7z

Это сообщение отредактировал(а) alexeis1 - 12.9.2006, 12:28


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
blablabla
Дата 12.9.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 7.9.2006

Репутация: нет
Всего: нет



Спасибо...  smile 
PM MAIL   Вверх
alex4012
Дата 26.7.2012, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.7.2012

Репутация: нет
Всего: нет



Сначала сильно огорчился потому что код не заработал (а это как раз то что нужно(( уже недели 3 ищу), а потом удивился) код работоспособен на exe-шниках delphi 7 но когда компилируешь под delphi XE2 то выходной exe просто коцается(( и не запускается) 

Подскажите как решить проблему?
PM MAIL   Вверх
Alexeis
Дата 26.7.2012, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



 Код работоспособен и на XE2 сейчас перекомпилировал оба экзешника и все работает также как и на семерке. Основную работу делает функция UpdateResource(Hnd, RT_RCDATA, PChar(ResName), 1049, Buf, Size) . Это WinApi функция, очень маловероятно, чтобы она что-то портила. Это никакой не хак, а вполне документированная функция. Нужно посмотреть под отладкой коды ошибок которые возникают.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stuq1
Дата 4.8.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 8.1.2012

Репутация: нет
Всего: нет



У меня такая же проблема, но потихоньку начинает получаться - я создаю свободно распространяемую среду программирования. Планирую там сделать возможность создавать программы на нескольких языках программирования.

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0935 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.