Используйте Delphi для реализации шифрования и сжатия файлов
Автор: E Mengyuan (Wnhoo)
Почта: [email protected]
Любовь и любовь
Нажмите, чтобы загрузить этот подробный файл описания
Обзор:
В этом документе мы поговорим о реализации шифрования данных, сжатии данных и самоуверенной экспрессии одного файла. Точно так же сжатие нескольких файлов или папок может быть достигнуто с небольшим изменением.
Ключевые слова: зашифрованное сжатие, Zlib, Stream, файлы ресурсов
введение:
В повседневной жизни мы должны использовать известное программное обеспечение для сжатия, такое как Winzip и Winrar, что означает, что мы неизбежно столкнемся с такими проблемами, как шифрование данных и сжатие данных в процессе разработки программного обеспечения! В этой статье обсуждается эта техническая проблема, а также благодаря всем пользователям пользователей за их навыки. В этой статье в основном используются мощные навыки обработки потоков Delph для достижения шифрования и сжатия данных, и используется в реальной разработке программных программ.
1. Системные функции
1) Сжатие данных
Используйте два класса потока, предоставленные Delphi (TCompressionStream и TdecompressionStream) для завершения сжатия и декомпрессии данных.
2) Шифрование и сжатие данных
Шифрование данных реализуется посредством применения «потока» в программировании Delphi, в основном с использованием Tfilestream и Tmemorystream, два производных класса TSTREAM;
3) Дважды щелкните сжатый файл, чтобы автоматически ассоциировать и распаковать
Изменяя ассоциацию расширения реестра с помощью программных файлов, в основном используется Tregistry;
4) может генерировать самопроизвольные файлы
Самоуверенный файл реализует автоматическую декомпрессию сжатия данных 1) и сжатие шифрования данных 2); Самоуверенная экспрессия данных достигается.
2. Реализация системы
2.1
2.2.
(I) Zlib
1) Базовый класс Tcustomzlibstream: базовый класс TompressionStream и TdecompressionStream.
Формат: ProcusureOnProgress (отправитель: Tobject); Dynamic;
2) Класс сжатия tcompressionStream: в дополнение к унаследованию свойства OnProgress базового класса добавляется другой атрибут: CompressionRate, который определяется следующим образом:
PropertyCompressionRate: SinglereAdgetCompressionRate;
Благодаря этому свойству можно получить коэффициент сжатия.
Несколько важных методов определяются следующим образом:
ContructortCompressionStream.create (CompressionLevel: tcompressionLevel; dest: tstream);
Среди них: tcompressionLevel (тип сжатия), он определяется следующим:
1) clnone: сжатие данных не выполнено;
2) Slaffect: выполняет быстрое сжатие, жертвуя эффективностью сжатия;
3) cldefault: выполнить нормальное сжатие;
4) CLMAX: максимизировать сжатие и скорость жертвы;
DEST: Поток назначения, используемый для хранения сжатых данных.
FunctionCompressionStream.Write (Constbuffer; Count: Longint): Longint;
Среди них: буфер: данные, которые необходимо сжать;
Подсчет: количество байтов данных для сжатия;
Функция возвращает количество байтов, записанных в поток.
Примечание. Данные сжатого класса TompressionStream могут быть записаны только если вы попытаетесь прочитать данные изнутри, произойдет исключение «ошибки». Данные, которые необходимо сжать, записываются в поток с помощью метода записи метода и сжимаются в процессе написания и сохраняются в потоке памяти (TmemoryStream), предоставленного конструктором, и запускается событие OnProcess.
3) Класс декомпрессии tdecompressionStream: в отличие от сжатого класса TcompressionStream, его данные могут быть прочитаны только в том случае, если вы попытаетесь записать данные внутри него, произойдет исключение «ошибки».
Его несколько важных методов определяются следующим образом:
ConstructorCreate (источник: tstream);
Среди них: источник - это поток, который хранит сжатые данные;
FunctionRead (varBuffer; count: longint): longint;
Функция считывания данных, буфер: хранить буфер данных;
Функция возвращает количество чтения байтов. В процессе чтения данные декомпрессируются, а событие OnProcess запускается.
(Ii)
В Delphi базовым классом всех потоковых объектов является класс TSTREAM, который определяет общие свойства и методы всех потоков.
Свойства, определенные в классе TSTREAM, следующие:
1), размер: это свойство возвращает размер данных в потоке в байтах.
2) Положение: это свойство контролирует положение доступа к указателям в потоке.
Есть четыре виртуальных метода, определенные в TSTREAM:
1) Читать: Этот метод реализует данные чтения из потока, а возвращаемое значение - это фактическое число чтения байтов, которое может быть меньше или равным указанному значению.
2) Напишите: этот метод реализует записи данных в потоку, а возвращаемое значение - это количество байтов, фактически записанных в поток.
3) Поиск: этот метод реализует движение указателя чтения в потоке, и возвратное значение является положением указателя после движения.
Прототип функции: functionseek (Offset: Longint; Porrint: Word): Longint; Virtual; Abstract;
Смещение параметров - это количество смещенных байтов.
Sofrombeginning: Offset - это начало данных расстояния указателя. В настоящее время смещение должно быть больше или равным нулю.
Sofromcurrent: Offset - это относительное положение указателя и тока указателя после перемещения.
Sofromend: Offset - это положение, в которой данные расстояния указателя заканчиваются после перемещения. В настоящее время смещение должно быть меньше или равным нулю.
4) setSize: этот метод осознает изменение размера данных.
Кроме того, в классе TSTREAM определяются несколько статических методов:
1) READBUFFER: Функция этого метода состоит в том, чтобы снимать данные из текущей позиции в потоке, так же, как приведенное выше.
ПРИМЕЧАНИЕ. Когда количество чтения байтов отличается от количества байтов, которые будут прочитаны, будет создано исключение Ereaderror.
2) writebuffer: функция этого метода состоит в том, чтобы записать данные в потоку в текущем месте, так же, как приведенный выше.
ПРИМЕЧАНИЕ. Когда количество байтов, записанных в данных, отличается от количества записанных байтов, будет создано исключение EwriteError.
3) CopyFrom: Функция этого метода состоит в том, чтобы копировать потоки данных из других потоков.
Прототип функции: functionCopyFrom (Источник: Tstream; Count: Longint): Longint;
Источник параметров - это поток, который предоставляет данные, а количество - это количество копированных байтов данных. Когда счет больше 0, копии копий отчисляют байты данных из текущей позиции параметра источника;
Обычно полученные классы TSTREAM:
TfileStream (доступ к потокам файлов)
TStringStream (обрабатывает данные типа строки в памяти)
TmemoryStream (для обработки данных рабочей области памяти)
Tblobstream (обработка данных полей типа Blob)
TwinsocketStream (Читать и записать обработку сокета)
ToLestream (обработка данных интерфейса COM)
Tresourcestream (обработка потоков файлов ресурсов)
Наиболее часто используемым является класс TfileStream. Чтобы получить доступ к файлам с помощью класса TfileStream, сначала необходимо создать экземпляр. Утверждение следующим образом:
ConstructorCreate (ConstfilEname: String; Mode: Word);
Имя файла - это имя файла (включая путь)
Режим - это способ открыть файл.
Открытый режим:
FMCreate: Создайте файл с указанным именем файла и откройте его, если файл уже существует.
FMOPENREAD: откройте указанный файл в только для чтения
FmopenWrite: откройте указанный файл только для записи
FmopenReadWrite: откройте указанный файл в режиме написания
Режим обмена:
FMShareCompat: общий режим совместим с FCBS
fmshareexclusize: никаких других программ не разрешается открывать файл каким -либо образом
fmsharedenywrite: никаких других программ не разрешается открывать файл в письменной форме
fmsharedenyread: никакие другие программы не разрешаются открывать файл в режиме чтения
fmsharedenenone: другие программы могут открыть файл любым образом
(Iii) Файл ресурса
1) Создание файлов ресурсов
Сначала создайте простой текстовый файл .rc.
Формат: Имя ключевого слова идентификатора ресурса
Идентификатор ресурсов: специальная метка при вызове ресурса в программе;
Ключевые слова: определить тип файла ресурса;
Волна: файл ресурса - это звуковой файл;
Rcdata: jpeg file;
Avi: Avi Animation;
Значок: файл значков;
Растровый карта: растровый файл;
Курсор: файл курсора;
Exefile: exe -файл
Имя файла ресурса: полное имя файла, хранящегося на диске файла ресурса
Например:
myzjyexefilezjy.exe
2) Скомпилируйте файлы ресурсов
Под /бин Delphi Installation Directory используйте BRCC32.exe для компиляции файла ресурса.rc. Конечно, вы также можете копировать BRCC32 в каталог документов программы отдельно для использования.
Например:
Brcc32wnhoo_reg.rc
3) Ссылка на файл ресурсов
…
Выполнение
{$ R*.dfm}
{$ Rwnhoo_reg.res}
…
4) Вызовы файлы ресурсов
(1) Доступ к растровому карту в файле ресурса (растровый карта)
Image.picture.bitmap.handle: = LoadBitMap (hinstance, 'идентификатор ресурса');
Примечание. Если растровый карта не загружену успешно, программа все равно будет выполнена, но изображение больше не будет отображаться. Вы можете судить, является ли нагрузка успешной на основе возврата значения функции Loadbitmap.
Другой метод доступа и отображения растрового изображения заключается в следующем
Image.picture.bitmap.loadfromresourcename (hinstance, «Идентификатор ресурса»);
(2) Доступ к курсору в файле ресурса
Screen.cursors [] - это массив курсора. Поскольку значение индекса курсора по умолчанию в массиве составляет 0, лучше всего установить настраиваемое значение индекса курсора на 1, если вы не хотите заменить курсор по умолчанию.
Screen.cursors [1]: = LoadCursor (hinstance, 'идентификатор ресурса');
Image.cursor: = 1;
(3) Доступ к значкам в файлах ресурсов
Размещение значка в файл ресурса позволяет динамически изменять значок приложения.
Application.icon.handle: = loadicon (hinstance, 'идентификатор ресурса');
(4) Доступ к AVI в файле ресурса
Animate.resname: = 'myavi'; // номер идентификатора ресурсов
Animate.active: = true;
(5) Доступ к JPEG в файле ресурсов
Добавьте блок JPEG в блок использования.
вар
Fjpg: tjpegimage;
Fstream: tresourcestream;
Начинать
Fjpg: = tjpegimage.create;
// Использование TRESOURCESTREAM
Fstream: = tresourcestream.create (hinstance, 'идентификатор ресурса, тип ресурса);
Fjpg.loadfromstream (fstream);
Image.picture.bitmap.assign (fjpg);
(6) Волна доступа в файле ресурса
Добавить MMSystem в единицу использования
Playsound (pchar ('mywav'), hinstance, snd_asyncorsnd_memoryorsnd_resource);
(Iv) операция файла INI
(1) Структура INI -файла:
; Это раздел комментариев о файле INI
[узел]
Ключевое слово = значение
...
Файл INI допускает несколько узлов, и каждый узел допускает несколько ключевых слов. Файл INI, истинное логическое значение представлено 1, а ложное логическое значение представлено 0). Комментарии начинаются с полуколона ";".
(2) Работа INI -файла
1. Добавить inifiles в раздел использования интерфейса;
2. Добавьте строку в варную часть определения: inifile: tinifile;
3. Откройте файл ini: inifile: = tinifile.create ('tmp.ini');
4. Прочитайте значение ключевого слова:
A: = inifile.readstring ('Node', 'Keyword', значение по умолчанию);
b: = inifile.readinteger ('node', 'Keyword', значение по умолчанию); // Целое число
c: = inifile.readbool ('Node', 'Keyword', значение по умолчанию);
Где [по умолчанию] - значение по умолчанию, возвращаемое, когда ключевое слово не существует в файле INI.
5. Напишите в INI -файл:
inifile.writestring ('node', 'Keyword', переменная или строковое значение);
inifile.writeinteger ('node', 'Keyword', переменная или целочисленное значение);
inifile.writebool ('node', 'ключевое слово', переменная или true или false);
Когда узел этого файла INI не существует, приведенный выше оператор также автоматически создаст файл INI.
6. Удалить ключевые слова:
inifile.deletekey ('node', 'Keyword'); // Удаление ключевого слова
inifile.erasesection ('node'); // Удаление узла
7. Операция узла:
inifile.readsection ('node', переменная TStrings); // Все имена ключевых слов в указанном разделе могут быть прочитаны в переменную строки списка;
inifile.readsections (переменная tstrings); // Вы можете прочитать все имена подраздела в файле INI в переменную строкового списка.
inifile.readsectionValues ('node', переменная TStrings); // Все строки (включая ключевые слова, =, значения) в указанном разделе в файле INI можно прочитать в переменной строкости.
8. релиз: inifile.distory;
(V) Документальные отношения
Использование
Реестр, Shlobj;
// реализовать связанную регистрацию
ProcecuuretMyzip.regzzz;
вар
Рег: Tregistry;
Начинать
reg: = tregistry.create;
reg.rootkey: = hkey_classes_root;
reg.openkey ('. zzz', true);
reg.writestring ('', 'myzip');
Reg.closekey;
reg.openkey ('myzip/shell/open/command', true);
// исполняемая программа, используемая для открытия файлов .zzz
reg.writestring ('', '' '+application.exename+' ""%1 "');
Reg.closekey;
reg.openkey ('myzip/defaulticon', true);
// пожалуйста значок текущей исполняемой программы в качестве значка файла .zzz
reg.writestring ('', ''+application.exename+', 0');
reg.free;
// теперь обновлять
Shchangenotify (shcne_assocchanged, shcnf_idlist, nil, nil);
конец;
2.3.
1. Сгенерировать временный зашифрованный файл INI
Временный формат файла для INI для шифрования:
[File1] // Узел, многопрофильное шифрование может быть достигнуто с помощью файла1..n в программном обеспечении
Filename = сжатое имя файла
Пароль = пароль декомпрессии
FileSize = размер файла
FEALEDATE = создать дату
ISJM = необходимо ли распахнуть?
Если вы реализуете хранилище информации нескольких файлов и папок, вы можете сохранить ключевое слово пароля под общим узлом. Эта статья только реализует шифрование одного файла, так как достаточного количества вышеупомянутого формата.
2. Объедините файл данных с помощью файла INI, используемого для шифрования, который может быть реализован в форме потока файла.
Зашифрованная диаграмма структуры файла:
Рисунок (1)
Рисунок (2)
Вышеупомянутые две формы могут использоваться в соответствии с фактическими условиями. Эта статья принимает структуру рисунка (1).
3. Для зашифрованных данных технология Zlib используется для реализации сжатого хранилища и генерации новых сжатых файлов.
2.4.
2.5
1 Создать исполняемый файл программы специально из декомпрессии
2 Создать файлы ресурсов в 1
3 Поместите файл ресурса в программу этого инструмента сжатия в этой статье и составьте его вместе.
4 Сгенерируйте самопроверка файла, объединив файл ресурса с помощью сжатого файла.
Схема структуры файла самостоятельно эксплуатируется:
5 Реализация самоуверенной экспрессии: разложение зашифрованных сжатых данных в своем собственном файле, затем снова декомпрессируя разложенные зашифрованные сжатые данные и разложить реальные файлы данных.
2.6 Системное программирование
Это весь код основной части этой реализации программного обеспечения, и здесь мы подробно объясним все технические детали этого программного обеспечения.
//wnhoo_zzz.pas
UNITWNHOO_ZZZ;
интерфейс
Использование
Windows, Forms, Sysutils, классы, Zlib, Registry, Inifiles, Dialogs, Shlobj;
тип
pass = string [20];
тип
Tmyzip = класс
Частный
{privateClarationShere}
защищен
{ProtectedDeclarationShere}
публичный
Процедуррегззз;
Procecures_file (Infilename, Outfilename: String; Пароль: Pass; ISJM: Boolean; YSBZ: Integer);
functionjy_file (inatileName: string; пароль: pass = ''): boolean;
ProcecurezJywj (varFileName: String);
ConstructorCreate;
destructordestroy; переопределить;
{publicDeclarationShere}
опубликовано
{опубликованная declarationshere}
конец;
Выполнение
contructortmyzip.create;
Начинать
Унаследованные
конец;
// ################################################################################################################################## вместе ######################################################################## вместе ######################################################################## вместе ######################################################################## вместе ######################################################################## вместе ##### #####
// исходное шифрование файла
proceadurejm_file (vfile: string; vartarget: tmemorystream; пароль: pass; isjm: boolean);
{
VFILE: зашифрованный файл
Цель: выходной целевой поток после шифрования 》》》》》
Пароль: пароль
ISJM: Это зашифровано?
------------------------------------------------------ ------------------------------------------------------ ---------------------------- -----------------
Зашифрованный размер файла = исходный размер файла + [INI зашифрованный файл сжатой информации] Размер + Размер Хранение типа данных размера [INI Encrypted Compressed File]]
------------------------------------------------------ ------------------------------------------------------ ---------------------------- ------------------------------------------
}
вар
tmpstream, instrem: tfileStream;
Размер файлов: целое число;
inifile: tinifile;
Имя файла: String;
Начинать
// Открытие требует [зашифрованный сжатый файл]
tmpstream: = tfilestream.create (vfile, fmopenreadorfmshareexclusize);
пытаться
// Записать [исходный поток файлов] в конце [временного зашифрованного сжатого потока файла]
Target.seek (0, sofromend);
Target.copyfrom (tmpstream, 0);
// Получить путь к файлу и генерировать [INI -зашифрованный файл сжатой информации]]
Имя файла: = ExtractFilePath (paramstr (0))+'tmp.in_';
inifile: = tinifile.create (имя файла);
inifile.writestring ('file1', 'filename', extractfilename (vfile));
inifile.writestring ('file1', 'пароль', пароль);
inifile.writeInteger ('file1', 'filesize', target.size);
inifile.writedatetime ('file1', 'filedate', теперь ());
inifile.writebool ('file1', 'isjm', isjm);
inifile.free;
// Читать в [INI -зашифрованном потоке файла сжатой информации INI]]
inStream: = tfileStream.create (имя файла, fmopenReadorFmShareexClusize);
пытаться
// продолжать добавлять [INI -зашифрованный файл сжатой информации] в конце [временного зашифрованного потока сжатого файла]]
instream.position: = 0;
Target.seek (0, sofromend);
Target.copyfrom (inistream, 0);
// Рассчитайте размер текущего [INI -зашифрованного файла сжатой информации]]
FileSize: = inistream.Size;
// продолжать добавлять информацию о размере [INI зашифрованного файла сжатой информации] в конце [временного зашифрованного файла]
Target.writebuffer (filesize, sizeof (filesize));
Окончательно
instrem.free;
deletefile (имя файла);
конец;
Окончательно
tmpstream.free;
конец;
конец;
// ************************************************** ********************************************* ********************************************* ********************************************* ********************************************* ********************************************* ********************************************* ************************* ***************
// сжатие потока
Procecures_stream (instream, Outstream: TSTREAM; YSBZ: Integer);
{
Instream: зашифрованный поток файлов для сжатия
Поток выходного файла выхода из внешнего сжатия
YSBZ: Стандарт сжатия
}
вар
YS: TcompressionStream;
Начинать
// указатель потока указывает на голову
instream.position: = 0;
// Выбор стандартов сжатия
Слушаки
1: ys: = tcompressionStream.create (clnone, outstream); // не сжимается
2: ys: = tcompressionStream.create (Clafle, Outstream); // Быстрое сжатие
3: ys: = tcompressionStream.create (cldefault, outstream); // Стандартное сжатие
4: ys: = tcompressionStream.create (clmax, outstream); // максимальное сжатие
еще
ys: = tcompressionStream.create (Slaff, Outstream);
конец;
пытаться
// Поток сжатия
ys.copyfrom (instrem, 0);
Окончательно
ys.free;
конец;
конец;
// ************************************************** ********************************************* ********************************************* ********************************************* ********************************************* ********************************************* ********************************************* ************************* *******************
// поток декомпрессия
ProcecureJy_stream (instream, Outstream: TSTREAM);
{
Instream: исходный файл сжатого потока
OUTSTER
}
вар
Jyl: tdecompressionstream;
BUF: массив [1..512] Ofbyte;
Sjread: целое число;
Начинать
instream.position: = 0;
jyl: = tdecompressionStream.create (instriam);
пытаться
повторить
// Читать фактический размер
sjread: = jyl.read (buf, sizeof (buf));
Ifsjread> 0then
Upstream.write (buf, sjread);
до (sjread = 0);
Окончательно
jyl.free;
конец;
конец;
// ************************************************** ********************************************* ********************************************* ********************************************* ********************************************* ********************************************* ********************************************* ************************* ***************
// реализовать связанную регистрацию
ProcecuuretMyzip.regzzz;
вар
Рег: Tregistry;
Начинать
reg: = tregistry.create;
reg.rootkey: = hkey_classes_root;
reg.openkey ('. zzz', true);
reg.writestring ('', 'myzip');
Reg.closekey;
reg.openkey ('myzip/shell/open/command', true);
// исполняемая программа, используемая для открытия файлов .zzz
reg.writestring ('', '' '+application.exename+' ""%1 "');
Reg.closekey;
reg.openkey ('myzip/defaulticon', true);
// пожалуйста значок текущей исполняемой программы в качестве значка файла .zzz
reg.writestring ('', ''+application.exename+', 0');
reg.free;
// теперь обновлять
Shchangenotify (shcne_assocchanged, shcnf_idlist, nil, nil);
конец;
// Сжатие файлов
ProcecuuretMyzip.ys_file (InfileName, OutFilEname: String; Пароль: Pass; ISJM: Boolean; YSBZ: Integer);
{
InfileName: // зашифрованные файлы должны быть сжаты
OutFilEname: // Сжатие файла, сгенерированного после шифрования
Пароль: // Незначальный пароль
ysbz: // Стандарт сжатия
}
вар
Instream: tmemorystream; // временный поток после шифрования файлов
outstream: tfileStream; // Сжатие потока выходного файла
Начинать
// Создать [временный поток после шифрования файлов]
InStream: = tmemorystream.create;
// шифрование файлов
jm_file (Infilenerame, Instream, Password, ISJM);
// Создать сжатый выход выходного файла
outstream: = tfileStream.create (OutFilename, fmcreate);
пытаться
// [временный поток после шифрования файла] сжатие
ys_stream (instream, outstream, ysbz);
Окончательно
Outstream.free;
enterstream.free;
конец;
конец;
// распаковывать файл
functiontmyzip.jy_file (inatileName: string; пароль: pass = ''): boolean;
вар
instrem, instream, fileStream_ok: tfileStream;
{
Instream: // unzip name файла
instriam: // INI временный поток файлов
fileStream_ok: // Незазазаррирование файла OK
}
Outstream: TmemoryStream; // Временный поток памяти
inifile: tinifile; // временный файл INI
FileSize: Integer; // Размер файла пароля
ResultValue: Boolean; // возвращаемое значение
Начинать
пытаться
inStream: = tfileStream.Create (InfileName, FMOPENREAD);
пытаться
outstream: = tmemorystream.create;
пытаться
jy_stream (instream, outstream);
// генерировать временный файл INI
inStream: = tfileStream.create (ExtractFilePath (paramstr (0))+'tmp.in _', fmcreate);
пытаться
// укажите на позицию переменной целочисленного типа, в которой хранится декодированная информация
Upstream.seek (-sizeof (filesize), sofromend);
// Читать в информации переменной
Upstream.readbuffer (FileSize, sizeof (FileSize));
// указывают на местоположение декодированной информации
Upstream.seek (-(filesize+sizeof (filesize)), sofromend);
// Читать декодированную информацию в поток INI
instream.copyfrom (outstream, filesize);
// Выпуск INI -потока файла
instrem.free;
// Читать информацию о файле INI
inifile: = tinifile.create (ExtractfilePath (paramstr (0))+'tmp.in_');
resultValue: = inifile.readbool ('file1', 'isjm', false);
ifresultvaluethen
Начинать
ifinifile.readstring ('file1', 'password', '') = trim (пароль)
ResultValue: = true
еще
ResultValue: = false;
конец
еще
ResultValue: = true;
ifresultvaluethen
Начинать
filestream_ok: = tfilestream.create (extractfilepath (paramstr (1))+inifile.readstring ('file1', 'filename', 'wnhoo.zzz'), fmcreate);
пытаться
Outstream.position: = 0;
filestream_ok.copyfrom (outstream, inifile.readinteger ('file1', 'filesize', 0));
Окончательно
filestream_ok.free;
конец;
конец;
inifile.free;
Окончательно
// удалить временные файлы INI
DeleteFile (ExtractFilePath (paramstr (0))+'tmp.in_');
конец;
//
Окончательно
Outstream.free;
конец;
Окончательно
instrem.free;
конец;
кроме
ResultValue: = false;
конец;
Результат: = ResultValue;
конец;
// Создание самооценка
ProcectureEtMyzip.zjywj (varfilEname: String);
вар
Myres: trsourcestream; // временно хранить самопроизвольный файл exe
MyFile: tfileStream; // Оригинальный поток файлов
xfilename: String; // временное имя файла
file_ok: tmemorystream; // Поток памяти сгенерированного файла
FileSize: Integer; // исходный размер файла
Начинать
IffileExists (имя файла) тогда
Начинать
// Создать поток памяти
file_ok: = tmemorystream.create;
// Отпустите файл ресурса-SEELF-EXPRACT FILE EXE
myres: = tresourcestream.create (hinstance, 'myzjy', pchar ('exefile'));
// Читать исходный файл в память
myfile: = tfilestream.create (имя файла, fmopenread);
пытаться
myres.position: = 0;
file_ok.copyfrom (myres, 0);
file_ok.seek (0, sofromend);
myfile.position: = 0;
file_ok.copyfrom (myfile, 0);
file_ok.seek (0, sofromend);
FileSize: = myFile.Size;
file_ok.writebuffer (filesize, sizeof (filesize));
file_ok.position: = 0;
xfilename: = changefileext (имя файла, '. exe');
file_ok.savetofile (xfilename);
Окончательно
myfile.free;
myres.free;
file_ok.free;
конец;
Deletefile (имя файла);
Имя файла: = XFILENAME;
конец;
конец;
// ################################################################################################################################## вместе ######################################################################## вместе ######################################################################## вместе ######################################################################## вместе ######################################################################## вместе ##### #####
destructortmyzip.destroy;
Начинать
унаследованные;
конец;
конец.
3. Заключение
Новая среда визуального программирования Delphi предоставляет нам удобный и быстрый инструмент разработки приложений Windows. Для разработчиков программ, использование Delphi для разработки прикладного программного обеспечения, несомненно, значительно повысит эффективность программирования. В Delphi вы можете легко использовать потоки для реализации различных форм данных, таких как обработка файлов, динамическая обработка памяти, обработка сетевых данных и т. Д., И написание программ будет значительно повысить эффективность.
Ссылки:
1. Delphi System Help
2. Feng Zhiqiang.
3. Чен Джингтао.