Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Как открыть файл exe в delphi


Как открыть exe файл с помощью Delphi?

 
ilnarab   (2004-06-02 20:24) [0]

Здрасте!
Подскажите пожалуйста: с помощью какой программы мне декапилировать ехе файл в .dpr и т. д.


 
Fredericco ©   (2004-06-02 20:31) [1]

DeDe
Но исходников, которые бы потом компилировались, ты не получишь.


 
Fredericco ©   (2004-06-02 20:36) [2]

Удалено модератором
Примечание: Маклауду прювет :) Федырыч, оффтоп не начинай... ;)


 
Jeer ©   (2004-06-02 20:38) [3]

Удалено модератором
Примечание: Оффтоп...


 
Fredericco ©   (2004-06-02 20:50) [4]

Удалено модератором
Примечание: Оффтоп...


 
TUser ©   (2004-06-02 20:54) [5]

Удалено модератором
Примечание: Оффтоп...


 
DrPass ©   (2004-06-02 23:02) [6]


> Подскажите пожалуйста: с помощью какой программы мне декапилировать
> ехе файл в .dpr и т. д.

Есть универсальная программа, называется Muzzle Decompiler Pro, последняя версия со 100% успехом восстанавливает исходные тексты по exe-файлу на языках Pascal, Delphi, C++, Perl и 1C. Только найти ее трудно.


 
ikivio ©   (2004-06-03 01:34) [7]

>DrPass Есть универсальная программа, называется
>Muzzle Decompiler Pro
По моему, она называется Muzzle Enterprise.


 
GebbelZ ©   (2004-06-03 22:03) [8]

и каждый раз одно и то же...
ну как люди не могут понять, что компиляция - ОДНОНАПРАВЛЕННАЯ процедура, и из EXE файла НИКАК НЕ ВОЗМОЖНО получить исходный код программы

а для изучения того или иного алгоритма работы можно воспользоваться дизасемблером:
- Sourcer (для DOS)
- Win32DASM
- IDA
- DEDE


 
Игорь Шевченко ©   (2004-06-03 22:43) [9]


> ну как люди не могут понять, что компиляция - ОДНОНАПРАВЛЕННАЯ
> процедура, и из EXE файла НИКАК НЕ ВОЗМОЖНО получить исходный
> код программы

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


 
Gero ©   (2004-06-03 23:24) [10]


> последняя версия со 100% успехом восстанавливает исходные
> тексты по exe-файлу на языках Pascal, Delphi, C++, Perl
> и 1C

Хм..


 
GebbelZ ©   (2004-06-03 23:41) [11]

2 Игорь Шевченко:
для человека, имеющего прямые руки и желание возможно _всё_!

по своему опыту - "получить код обладающей той же функциональностью" ох как сложно...

>>генерирует в принципе, одинаковый код для конкретных конструкций языка высокого уровня, так что восстановить эти конструкции в большинстве случаев можно.

ага, а про оптимизации кода мы забыли?

"декомпиляторы" есть - для Clipera и для VB, но чтобы из EXE получить DPR - никогда :)


 
Gero ©   (2004-06-03 23:43) [12]


> но чтобы из EXE получить DPR - никогда :)

Неправда.


 
Игорь Шевченко ©   (2004-06-03 23:47) [13]


> ага, а про оптимизации кода мы забыли?

Оптимизация тоже детерминирована, а следовательно, в какой-то степени обратима. Зная набор правил оптимизации, подобрать нужный алгоритм к известному коду вполне реально, только не быстро, а я с самого начала говорил, что это непростое занятие. Кроме того, никто же не ставит целью получение из оптимизированного машинного кода исходный неоптимизированный, не так ли ?


 
GebbelZ ©   (2004-06-04 00:09) [14]

как я уже сказал - "для человека, имеющего прямые руки и желание возможно _всё_!"

согласен ;)

но скормив EXE файл декомпилятору и получив набор каких-нибудь файлов ещё не факт что этот проект будет компилироваться

тем более сложность процесса восстановления кода и затраты времени увеличиваются в геом. прогрессии в зависимости от размера EXE файла...

да ещё "набор правил оптимизации" может меняться в зависимости от номера билда дельфи...

гемороя море :)


 
Zet   (2004-06-10 11:17) [15]

Удалено модератором
Примечание: Задавй вопрос в своей ветке


 
Rule ©   (2004-06-10 11:30) [16]

Удалено модератором
Примечание: Ответ пошлешь туда


 
stone ©   (2004-06-10 11:43) [17]

Ребятя, вы о чем? Человеку надо
> декапилировать ехе файл

Это капиляры из него извлечь что-ли?


 
Anatoly Podgoretsky ©   (2004-06-10 11:47) [18]

GebbelZ ©   (04.06.04 00:09) [14]
гемороя море :)

Не то слово, но теоритически возможно, только зачем говорить об ехе, что надо кроме текста программы еще и библиотеки декомпилировать?

ЗЫ: Декапилиция это вроде бы процесс удаления волос с ног?


 
Rule ©   (2004-06-10 12:21) [19]

Удалено модератором
Примечание: И сейчас это делаешь, при том прямо это здесь же и признаешь


 
Странник ©   (2004-06-10 12:36) [20]

Ну куда все смотрят?!!! Все в программирование.
Вопрос был: декапилировать ехе файл !!!!!

Декапилировать - т.е. убрать капли. А какие капли могут быть в ехе-файле?
Водочные, пивные и т.п. - кефирчику с утра попить.
если другие капли - то и рецепты другие.


 
Digitman ©   (2004-06-10 13:03) [21]


> Anatoly Podgoretsky ©   (10.06.04 11:47) [18]
> ЗЫ: Декапилиция это вроде бы процесс удаления волос с ног?

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

позволю себе пофантазировать  : не менее чуден был бы обратный процесс - ДЕэпиляция, т.е. не сбор урожая, а посев


Как открыть exe файл с помощью Delphi?

 
ilnarab   (2004-06-02 20:24) [0]

Здрасте!
Подскажите пожалуйста: с помощью какой программы мне декапилировать ехе файл в .dpr и т. д.


 
Fredericco ©   (2004-06-02 20:31) [1]

DeDe
Но исходников, которые бы потом компилировались, ты не получишь.


 
Fredericco ©   (2004-06-02 20:36) [2]

Удалено модератором
Примечание: Маклауду прювет :) Федырыч, оффтоп не начинай... ;)


 
Jeer ©   (2004-06-02 20:38) [3]

Удалено модератором
Примечание: Оффтоп...


 
Fredericco ©   (2004-06-02 20:50) [4]

Удалено модератором
Примечание: Оффтоп...


 
TUser ©   (2004-06-02 20:54) [5]

Удалено модератором
Примечание: Оффтоп...


 
DrPass ©   (2004-06-02 23:02) [6]


> Подскажите пожалуйста: с помощью какой программы мне декапилировать
> ехе файл в .dpr и т. д.

Есть универсальная программа, называется Muzzle Decompiler Pro, последняя версия со 100% успехом восстанавливает исходные тексты по exe-файлу на языках Pascal, Delphi, C++, Perl и 1C. Только найти ее трудно.


 
ikivio ©   (2004-06-03 01:34) [7]

>DrPass Есть универсальная программа, называется
>Muzzle Decompiler Pro
По моему, она называется Muzzle Enterprise.


 
GebbelZ ©   (2004-06-03 22:03) [8]

и каждый раз одно и то же...
ну как люди не могут понять, что компиляция - ОДНОНАПРАВЛЕННАЯ процедура, и из EXE файла НИКАК НЕ ВОЗМОЖНО получить исходный код программы

а для изучения того или иного алгоритма работы можно воспользоваться дизасемблером:
- Sourcer (для DOS)
- Win32DASM
- IDA
- DEDE


 
Игорь Шевченко ©   (2004-06-03 22:43) [9]


> ну как люди не могут понять, что компиляция - ОДНОНАПРАВЛЕННАЯ
> процедура, и из EXE файла НИКАК НЕ ВОЗМОЖНО получить исходный
> код программы

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


 
Gero ©   (2004-06-03 23:24) [10]


> последняя версия со 100% успехом восстанавливает исходные
> тексты по exe-файлу на языках Pascal, Delphi, C++, Perl
> и 1C

Хм..


 
GebbelZ ©   (2004-06-03 23:41) [11]

2 Игорь Шевченко:
для человека, имеющего прямые руки и желание возможно _всё_!

по своему опыту - "получить код обладающей той же функциональностью" ох как сложно...

>>генерирует в принципе, одинаковый код для конкретных конструкций языка высокого уровня, так что восстановить эти конструкции в большинстве случаев можно.

ага, а про оптимизации кода мы забыли?

"декомпиляторы" есть - для Clipera и для VB, но чтобы из EXE получить DPR - никогда :)


 
Gero ©   (2004-06-03 23:43) [12]


> но чтобы из EXE получить DPR - никогда :)

Неправда.


 
Игорь Шевченко ©   (2004-06-03 23:47) [13]


> ага, а про оптимизации кода мы забыли?

Оптимизация тоже детерминирована, а следовательно, в какой-то степени обратима. Зная набор правил оптимизации, подобрать нужный алгоритм к известному коду вполне реально, только не быстро, а я с самого начала говорил, что это непростое занятие. Кроме того, никто же не ставит целью получение из оптимизированного машинного кода исходный неоптимизированный, не так ли ?


 
GebbelZ ©   (2004-06-04 00:09) [14]

как я уже сказал - "для человека, имеющего прямые руки и желание возможно _всё_!"

согласен ;)

но скормив EXE файл декомпилятору и получив набор каких-нибудь файлов ещё не факт что этот проект будет компилироваться

тем более сложность процесса восстановления кода и затраты времени увеличиваются в геом. прогрессии в зависимости от размера EXE файла...

да ещё "набор правил оптимизации" может меняться в зависимости от номера билда дельфи...

гемороя море :)


 
Zet   (2004-06-10 11:17) [15]

Удалено модератором
Примечание: Задавй вопрос в своей ветке


 
Rule ©   (2004-06-10 11:30) [16]

Удалено модератором
Примечание: Ответ пошлешь туда


 
stone ©   (2004-06-10 11:43) [17]

Ребятя, вы о чем? Человеку надо
> декапилировать ехе файл

Это капиляры из него извлечь что-ли?


 
Anatoly Podgoretsky ©   (2004-06-10 11:47) [18]

GebbelZ ©   (04.06.04 00:09) [14]
гемороя море :)

Не то слово, но теоритически возможно, только зачем говорить об ехе, что надо кроме текста программы еще и библиотеки декомпилировать?

ЗЫ: Декапилиция это вроде бы процесс удаления волос с ног?


 
Rule ©   (2004-06-10 12:21) [19]

Удалено модератором
Примечание: И сейчас это делаешь, при том прямо это здесь же и признаешь


 
Странник ©   (2004-06-10 12:36) [20]

Ну куда все смотрят?!!! Все в программирование.
Вопрос был: декапилировать ехе файл !!!!!

Декапилировать - т.е. убрать капли. А какие капли могут быть в ехе-файле?
Водочные, пивные и т.п. - кефирчику с утра попить.
если другие капли - то и рецепты другие.


 
Digitman ©   (2004-06-10 13:03) [21]


> Anatoly Podgoretsky ©   (10.06.04 11:47) [18]
> ЗЫ: Декапилиция это вроде бы процесс удаления волос с ног?

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

позволю себе пофантазировать  : не менее чуден был бы обратный процесс - ДЕэпиляция, т.е. не сбор урожая, а посев


Выполнение приложений из кода Delphi

Допустим, имеется приложение, работающие с базой данных, которое использует внешнюю утилиту для резервного копирования данных. Эта утилита получает параметры из Вашего приложения и делает резервное копирование данных, а приложение ждет, пока утилита не закончит работу.

А с другой стороны, Вы хотели когда-либо открыть документы, которые представлены в ListBox, только дважды щелкнув по ним без необходимости открывать связанную с этим документом программу?

Наконец, вообразите Label-ссылку в Вашей программе, которая перенесет пользователя на связанную с ней страницу (запуская Internet Explorer). Кроме того, что Вы скажете относительно отсылки электронной почты непосредственно из Вашего Delphi приложения через почтового клиента Windows по умолчанию (например, MS Outlook Express)?

ShellExecute

Чтобы запустить приложение или выполнить файл в среде Win32, мы будем использовать функцию Windows API ShellExecute. Как Вы увидите, можно открыть любой тип документа из Вашей программы без того, чтобы узнавать какая программа связана с этим документом в системном реестре.

Давайте посмотрим на это в действии!

Убедитесь, что добавили ShellApi в раздел uses Вашего модуля!

Запустить Блокнот

 uses { ... }, ShellApi;
 
 { ... }
 
 ShellExecute(Handle, 'open', 'C:\Windows\Notepad.exe', 
 nil, nil, SW_SHOWNORMAL) ;
 
Открыть Untitled.txt и Запустить Блокнот

 ShellExecute(Handle,'open', 'C:\Windows\Notepad.exe',
 'C:\Untitled.txt', nil, SW_SHOWNORMAL) ;
 
Отобразить Содержимое Папки "Temp"

 ShellExecute(Handle,'open', 'C:\Temp',
 nil, nil, SW_SHOWNORMAL) ;
 
Выполнить Файл по Его Расширению

 ShellExecute(Handle, 'open', 'C:\MyDocuments\Test.doc',
 nil, nil, SW_SHOWNORMAL) ;
 
Открыть Сайт или *.htm Файл с Заданным по Умолчанию Браузером

 ShellExecute(Handle, 'open', 'http://delphiru.ru',
 nil, nil, SW_SHOWNORMAL) ;
 
Послать Электронное Письмо с Темой и Текстом Сообщения

 var em_subject, em_body, em_mail : string;
 begin
 em_subject := 'Это тема сообщения';
 em_body := 'Текст самого сообщения';
 
 em_mail := 'mailto: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ?subject=' +
 em_subject + '&body=' + em_body ;
 
 ShellExecute(Handle,'open',
 PChar(em_mail), nil, nil, SW_SHOWNORMAL) ;
 end;
 
Запустить Программу и Ждать Ее Завершения

Этот пример использует функцию API ShellExecuteEx:


 // Запустить Калькулятор Windows и вывести
 // сообщение, когда Калькулятор закончит работу.
 uses ShellApi;
 
 { ... }
 
 var
 SEInfo: TShellExecuteInfo;
 ExitCode: DWORD;
 ExecuteFile, ParamString, StartInString: string;
 begin
 ExecuteFile:='C:\Windows\Calc.exe';
 
 FillChar(SEInfo, SizeOf(SEInfo), 0) ;
 SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
 with SEInfo do begin
 fMask := SEE_MASK_NOCLOSEPROCESS;
 Wnd := Application.Handle;
 lpFile := PChar(ExecuteFile) ;
 {
 ParamString может содержать
 дополнительные параметры.
 }
 // lpParameters := PChar(ParamString) ;
 {
 StartInString определяет имя
 рабочего каталога
 Если нет, используется текущий каталог.
 }
 // lpDirectory := PChar(StartInString) ;
 nShow := SW_SHOWNORMAL;
 end;
 if ShellExecuteEx(@SEInfo) then begin
 repeat
 Application.ProcessMessages;
 GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
 until (ExitCode STILL_ACTIVE) or
 Application.Terminated;
 ShowMessage('Калькулятор завершил работу') ;
 end
 else ShowMessage('Ошибка запуска Калькулятора!') ;
 end;
 

классика Pascal. Работа с типизированными файлами в Delphi – Delphi в Internet

Удивительно, но факт – запрос “delphi файлы” в Яндексе – это один из самых популярных запросов, касающихся Delphi. Популярнее только “delphi скачать” – видимо ещё не все слышали про такую штуку как Delphi Community Edition. Раз есть в Сети запрос – должен быть и ответ. Посмотрим, что получится в итоге.

Содержание статьи

Классика работы с файлами в Delphi – ключевое слово File

Этот способ, без преувеличения, можно назвать древнейшим способом работы с файлами в Pascal/Delphi. Однако и он до сих пор используется в работе, особенно, если это, например, лабораторная работа по информатике в школе или ВУЗе.

Для определения файловой переменной в Delphi/Pascal используется ключевое слово File. При этом, мы можем определить как типизированный файл, так и не типизированный, например:

type TPerson = record Name: string[20]; Family: string[20]; end;   var UntypedFile: File; //нетипизированный двоичный файл TypedFile: File of TPerson;//типизированный файл

Для типизированного фала мы можем задать тип данных фиксированного размера (ShortString, String[20], Integer, Single и так далее), например, мы можем определить такие типизированные файлы:

 IntFile: File of integer; StringFile: file of single; ShortStringFile: file of ShortString;

Или, как в примере выше использовать для указания типа запись (record), в которой все поля имеют фиксированный размер. Для типизированного файла нельзя указывать типы данных, размер которых не фиксирован, например, вот такие определения файловых переменных недопустимы:

type TIntArr = array of integer;   var StrFile: file of string; //недопустимо - размер string заранее не известен ArrFile: file of TIntArr;//недопустимо - размер динамического массива заранее неизвестен

Более того, даже компилятор Delphi укажет вам на ошибку, сообщив следующее:

[dcc32 Error] E2155 Type ‘string’ needs finalization – not allowed in file type

Определив файловую переменную можно приступать к работе с файлом. Алгоритм работы при этом будет следующим:

  1. Ассоциировать файловую переменную с файлом на диске
  2. Открыть файл
  3. Записать/Прочитать файл
  4. Закрыть файл

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

Работа с типизированными файлами в Delphi

Рассмотрим несколько примеров работы с типизированными файлами в Delphi.
Для начала, рассмотрим вариант работы с типизированным файлом, например, представленном выше:

type TPerson = record Name: string[20]; Family: string[20]; end; var TypedFile: File of TPerson;

Пример №1. Запись данных в типизированный файл Delphi

Запишем в наш файл две записи:

program example_1;   {$APPTYPE CONSOLE}   {$R *.res}   uses System.SysUtils;   type TPerson = record Name: string[20]; Family: string[20]; end;   var TypedFile: File of TPerson; Person: TPerson; begin //связываем файловую переменную с файлом на диске AssignFile(TypedFile,'MyFile.txt'); //открываем файл для записи Rewrite(TypedFile); //задаем имя/фамилию человека Person.Name:='Иван'; Person.Family:='Иванов'; //добавляем запись в файл Write(TypedFile, Person); //задаем имя/фамилию второго человека Person.Name:='Петр'; Person.Family:='Петров'; //записываем в файл Write(TypedFile, Person); //закрываем файл CloseFile(TypedFile);   Readln; end.

Рассмотрим методы, используемые в этом примере:

function AssignFile(var F: File; FileName: String): Integer;

Связывает файловую переменную F с внешним файлом FileName. В качестве второго параметра может задаваться как абсолютный путь к файлу, например, ‘C:/MyFile.txt‘, так и относительный, например, в коде выше файл будет создан рядом с exe-файлом.

procedure Rewrite(var F: File; [ RecSize: Integer]);

Создает новый файл и открывает его. Если внешний файл с таким именем уже существует, он удаляется и на его месте создается новый пустой файл. Если F уже открыт, он сначала закрывается, а затем воссоздается. Текущая позиция файла устанавливается в начале пустого файла.
F – это переменная, связанная с внешним файлом с использованием AssignFile. RecSize – это необязательное выражение, которое можно указывать, только если F является нетипизированным файлом (об этом ниже).

procedure Write([var F: File]; P1; [ ..., PN]); overload;

Используется для записи в типизированный файл. F – файловая переменная, P1..PN – это переменная того же типа, что и тип файла F.

procedure CloseFile(var F: File);

Прекращает связь между файловой переменной и файлом внешнего диска. F – это файловая переменная любого типа. Внешний файл, связанный с F, полностью обновляется, а затем закрывается, освобождая дескриптор файла для повторного использования.

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

Для того, чтобы в delphi не перезаписывать каждый раз файл, а добавлять в конец файла новые записи необходимо открывать типизированные файлы методом Reset. Рассмотрим пример добавления новых записей в типизированные файлы Delphi.

Пример №2. Добавление записей в типизированный файл Delphi

Рассмотрим такой пример Delphi:

program example_2;   {$APPTYPE CONSOLE}   {$R *.res}     uses System.SysUtils;   type TPerson = record Name: string[20]; Family: string[20]; Age: integer; end;   procedure ReadTypedFile; const cStr = '%s %s %d'; var F: File of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); Reset(F); while not Eof(F) do begin Read(F, Person); Writeln(Format(cStr, [Person.Name, Person.Family, Person.Age])); end; end;   procedure AppendTypedFile; var F: file of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); // открываем файл для записи Reset(F); Seek(F, FileSize(F)); // задаем имя/фамилию человека Writeln('Введите имя: '); Readln(Person.Name); Writeln('Введите фамилию: '); Readln(Person.Family); Writeln('Введите возраст: '); Readln(Person.Age); // добавляем запись в файл Write(F, Person); // закрываем файл CloseFile(F); end;   var TypedFile: File of TPerson; Person: TPerson; DoAppend: integer;   begin if not FileExists('MyFile.txt') then begin AssignFile(TypedFile, 'MyFile.txt'); // открываем файл для записи Rewrite(TypedFile); // закрываем файл CloseFile(TypedFile); end;   // связываем файловую переменную с файлом на диске repeat Writeln('Добавить в файл запись: 1 - Да; 2 - Нет'); Readln(DoAppend); case DoAppend of 1: AppendTypedFile; 2: break; end; until DoAppend = 0; //читаем все записи из типизированного файла ReadTypedFile; Readln; end.

Разберемся с тем, что здесь делается. Во-первых, условие:

if not FileExists('MyFile.txt') then

проверяет, существует ли файл на диске. Метод FileExist имеет следующее описание:

function FileExists(const FileName: string; FollowLink: Boolean = True): Boolean;

FileName – имя файла, существование которого необходимо проверить. Второй параметр – FollowLink учитывается только при использовании символической ссылки. То есть, если нужно проверить только наличие символической ссылки на файл, то параметр FollowLink устанавливается в False, а если нужно проверить наличие и символической ссылки на файл и самого файла, то FollowLink устанавливается в True (значение по умолчанию).

Таким образом, в нашем примере, если файла нет на диске то он создается пустым. Далее выполняется цикл:

repeat Writeln('Добавить в файл запись: 1 - Да; 2 - Нет'); Readln(DoAppend); case DoAppend of 1: AppendTypedFile; 2: break; end; until DoAppend = 0;

В этом цикле, если пользователь вводит 1, выполняется процедура AppendTypedFile, которая добавляет в файл очередную запись:

procedure AppendTypedFile; var F: file of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); // открываем файл для записи Reset(F); //смещаемся в конец файла Seek(F, FileSize(F)); // задаем имя/фамилию человека Writeln('Введите имя: '); Readln(Person.Name); Writeln('Введите фамилию: '); Readln(Person.Family); Writeln('Введите возраст: '); Readln(Person.Age); // добавляем запись в файл Write(F, Person); // закрываем файл CloseFile(F); end;

Здесь, в принципе, весь алгоритм расписан в комментариях к процедуре.
Метод Reset не воссоздает файл снова, как Rewrite, а открывает его для чтения/записи (в случае двоичных файлов). Что касается метода Seek, то он имеет следующее описание:

procedure Seek(var F: File; N: Integer);

F – файловая переменная, ассоциированная с файлом на диске, N – номер записи в файле (первый номер – 0). Чтобы переместиться сразу в конец файла, мы сделали такой вызов:

где FileSize – это метод Delphi имеющий следующее описание:

function FileSize(var F: File): Integer;

В случае использования типизированных файлов эта функция возвращает количество записей в файле.

После того, как пользователь вводит что-то кроме 1 срабатывает метод ReadTypedFile – чтение всех записей из файла:

procedure ReadTypedFile; const cStr = '%s %s %d'; var F: File of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); Reset(F); while not Eof(F) do begin Read(F, Person); Writeln(Format(cStr, [Person.Name, Person.Family, Person.Age])); end; end;

Здесь мы, опять же, открываем файл методом Reset и в цикле while..do проходим по всем записям файла, пока не дойдем до конца. Здесь мы использовали два новых метода Delphi:

function Eof([var F: File]): Boolean; overload;

Eof возвращает True, если текущая позиция файла находится за последним символом файла или файл пуст. В противном случае Eof возвращает False.
По аналогии с методом Write, метод Read производит чтение очередной записи из файла и имеет следующее описание:

procedure Read(var F: File; V1; [ ..., VN]);

Результат работы нашего примера может быть следующим:

Ещё одним полезным методом для работы с типизированными файлами может быть процедура Truncate:

procedure Truncate(var F: File);

Удаляет все записи после текущей позиции файла. Вызовите Truncate в коде Delphi, чтобы текущая позиция файла стала концом файла (Eof (F) вернет true).
Рассмотрим пример использования этой процедуры.

Пример №3. Удаление последних записей типизированного файла в Delphi

Воспользуемся файлом, созданным в предыдущем примере и удалим из него две последние записи:

program example_3;   {$APPTYPE CONSOLE}   {$R *.res}     uses System.SysUtils;   type TPerson = record Name: string[20]; Family: string[20]; Age: integer; end;   procedure ReadTypedFile; const cStr = '%s %s %d'; var F: File of TPerson; Person: TPerson; begin AssignFile(F, 'MyFile.txt'); Reset(F); while not Eof(F) do begin Read(F, Person); Writeln(Format(cStr, [Person.Name, Person.Family, Person.Age])); end; end;   var TypedFile: File of TPerson; Person: TPerson; Count: integer; DoErase: integer; begin AssignFile(TypedFile,'MyFile.txt'); Reset(TypedFile); Count:=FileSize(TypedFile); if Count<2 then begin Writeln('Количество записей в файле меньше двух. Стереть все записи? 1 - Да; 2 - Нет'); Readln(DoErase); if DoErase=1 then Truncate(TypedFile); end else begin Seek(TypedFile, Count-2); Truncate(TypedFile); end; //читаем все записи из типизированного файла ReadTypedFile; Readln; end.

В этом примере мы делаем следующее:

  1. Открываем файл существующий AssignFile/Reset
  2. Определяем количество записей в файле (Count:=FileSize(TypedFile))
  3. Если количество записей меньше двух, то спрашиваем у пользователя стереть ли все записи и, в случае положительного ответа, вызываем метод Tuncate
  4. Если количество записей в файле больше двух, то смещаемся на нужную нам позицию в файле (Seek(TypedFile, Count-2)) и затираем две последние записи методом Truncate.

Подведем итог

Для работы с типизированными файлами в Delphi в самом общем случае нам необходимо выполнить следующую последовательность операций:

  1. Определить тип записей в файле – это могут быть стандартные типы данных Delphi с фиксированным размером: ShortString, integer, single и так далее или собственные типы данных, например, записи (record), но, в этом случае, главное условие – размер записи должен быть фиксированным.
  2. В коде Delphi/Pascal определить файловую переменную, используя ключевое слово file и, указав тип записей файла, определенный в пункте 1.
  3. Ассоциировать файловую переменную с внешним файлом на диске, используя метод AssignFile.
  4. Открыть файл для чтения/записи, используя методы Rewrite/Reset.
  5. Чтобы сделать в файл очередную запись используем метод Write, для чтения очередной записи из файла – используем метод Read.
  6. Закрыть файл методом CloseFile.

В целом, рассмотренные выше примеры не охватывают всех возможностей работы с типизированными файлами в Delphi, а, скорее, показывают основные операции по работе с типизированными файлами. Поэтому ниже представлен перечень методов которые могут применяться при работе с типизированными файлами в Delphi/Pascal.

Функции и процедуры для работы с типизированными файлами в Delphi/Pascal

Метод Краткое описание
procedure AssignFile(var F: File; FileName: String)
Ассоциирует файловую переменную F с внешним файлом FileName. Переменная FileName может быть как именем файла, так и содержать полный путь к файлу на диске.
procedure CloseFile(var F: File);
Закрывает файл, ассоциированный с переменной F и освобождает переменную для дальнейшего использования.
function Eof(var F: File): Boolean;
Проверяет конец файла и возвращает True, если файловый указатель стоит в конце файла. В случае записи True означает, что очередной компонент будет добавлен в конец файла, при чтении – что файл прочтен полностью.
procedure Erase(var F: File);
Удаляет внешний файл, связанный с файловой переменной F. Перед удалением файла его необходимо закрыть методом CloseFile.
 
function FilePos(var F: File): Integer;
Возвращает текущую позицию в файле. В коде Delphi используйте FilePos для файловой переменной открытого файла, чтобы определить текущую позицию в файле. Если текущая позиция в файле находится в начале, FilePos возвращает 0.
 
function FileSize(var F: File): Integer;

 

Для типизированных файлов возвращает количество записей в файле.
procedure Read(var F: File; V1; [ ..., VN]);
Считывает из типизированного файла одну или несколько записей
procedure Rename(var F: File; Newname: String);
Переименовывает файл, ассоциированный с переменной F
procedure Reset(var F: File; [ RecSize: Integer]);
Открывает файл для чтения. Второй параметр RecSize указывается в случае использования нетипизированных файлов и указывает размер записи в файле в байтах
procedure Rewrite(var F: File; [ RecSize: Integer]);
Воссоздает файл. Если файл существует, то Rewrite его удалит, а затем создаст снова. RecSize используется для нетипизированных файлов
procedure Seek(var F: File; N: Integer);
Перемещает текущую позицию в файле к записи N (первая запись имеет номер 0)
procedure Truncate(var F: File);
Стирает из файла данные, расположенные за текущей позицией
procedure Write([var F: File]; P1; [ ..., PN]);
Записывает в файл F одну или несколько записей
Take Our Poll

0 0 голос

Рейтинг статьи

Декомпиляция, распаковка .exe архива в Delphi

Нашел уникальное решение проблемы распаковки файлов exe, но платное. Хотя есть тестовый период.

Тюнер ресурсов позволяет просматривать, извлекать, заменять, изменять и удалять внедренные ресурсы исполняемых файлов: иконы, строки, изображения, звуки, диалоги, меню - все, что составляют визуальную часть ваших программ Windows.

Скриншоты редактор ресурсовНа самом деле, это позволяет добавить свой собственный брендинг в приложение, изменить диалоговые сообщения, настраивать панели инструментов действия, и так далее, не имея доступ к актуальной исходного кода. Resource Tuner предлагает захватывающие возможности, даже если вы не программист. Это идеально подходит для переводчиков, твикерами, и всех, кто хочет другой внешний вид для приложения.

Тюнер ресурсов о единственном инструменте вы, вероятно, доверять изменять ресурсы в PE исполняемого файла. Откройте для себя уникальные свойства этого редактора ресурсов , в том числе, как открыть проблемные исполняемые файлы и редактировать скрытые данные, которые другие редакторы просто не может видеть, широкий спектр поддерживаемых типов ресурсов, для распаковки UPX, и многое другое. Вы узнаете, стандартную программу промышленности для перевода и настройки пользовательского интерфейса.

Тюнер ресурсов с огромным количеством функций, которые делают его важным инструментом для тех, кто настройки еще программы. Удачи персонализации любое приложение на свой неповторимый вкус. С помощью мощных Resource Tuner, вам больше не нужно страдать с уродливыми икон и картин по умолчанию. Использование очень просто, просто запустите программу и выберите EXE или DLL файл, чтобы прочитать данные из.

После того, как вы попробуете это, мы думаем, вам будет трудно вернуться на другой ресурс хакерских утилит.

shellexecute - Как запустить Delphi 7 из EXE-файла, написанного на Delphi XE?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

Как добавить настройки и сделать их встроенными в существующий exe-файл в Delphi

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

Извлечение файла проекта из delphi.exe

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.Компиляция

- Delphi не создает исполняемых файлов

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

delphi - Вставить приложение (файл exe) в другой файл exe (например, mozEmbed)

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант
.

Как узнать путь вызова командного файла в Delphi?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики & amp
.

Смотрите также