Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Маленький гигант большого интерфейса

Фленов Михаил

Xakep, номер #069, стр. 069-120-3


Reset(file) – открыть связанный с переменной file файл. Такой файл уже должен существовать.

Writeln(file, str) – записать в файл строку str.

ReadLn(file, str) – если файл открыт для чтения, то этой функцией можно прочитать строку.

CloseFile(file) – закрыть указанный файл.

Логика

Несмотря на то что файл манифеста состоит из множества строк, мы сохраняем все в один заход. Для этого подготавливается переменная s типа String, которая содержит все строки и переводы каретки, и одним вызовом функции writeln содержимое строки записывается в файл.

Диск – это одно из слабых мест современного компьютера, потому что это механика, а не электроника. Старайтесь всегда оптимизировать доступ к файлам и читать или записывать данные большими блоками.

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

DeleteFile(PChar(EditBox1.Text+'.manifest'));

Итого

На рисунке 4 показано окно программы The Bat! после добавления файла манифеста (патчинга сегодняшней прогой). Эта версия не умела отображаться в стиле XP и кнопки, элементы управления были квадратными до моего вмешательства.

Если тебе нужна утилита маленького размера и не хочется заморачиваться с Windows API, то выбирай KOL+MCK. Это отличный способ оптимизировать размер программы без потери скорости разработки. Лично я с этой библиотекой познакомился недавно и теперь все исполняемые файлы, которые должны будут пересылаться через инет, пишу только с ее помощью.

Листинг 1. Код патчинга

procedure TForm1.Button1Click(Sender: PObj);

var

s : String;

f:TextFile;

begin

AssignFile(f, EditBox1.Text+'.manifest');

Rewrite(f);

s:='<?xml version="1.0" encoding="UTF-8" standalone="yes"?> '+#13#10+

'<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> '+#13#10+

'<assemblyIdentity'+#13#10+

'version="1.0.0.0"'+#13#10+

'processorArchitecture="X86"'+#13#10+

'name="Microsoft.Windows.Program"'+#13#10+

'type="win32"'+#13#10+

'/> '+#13#10+

'<description> Your app description here</description> '+#13#10+

'<dependency> '+#13#10+

'<dependentAssembly> '+#13#10+

'<assemblyIdentity'+#13#10+

'type="win32"'+#13#10+

'name="Microsoft.Windows.Common-Controls"'+#13#10+

'version="6.0.0.0"'+#13#10+

'processorArchitecture="X86"'+#13#10+

'publicKeyToken="6595b64144ccf1df"'+#13#10+

'language="*"'+#13#10+

'/> '+#13#10+

'</dependentAssembly> '+#13#10+

'</dependency> '+#13#10+

'</assembly> ';

writeln(f, s);

CloseFile(f);

end;

Листинг 2. Содержимое файла манифеста

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity

version="1.0.0.0"

processorArchitecture="X86"

name="Microsoft.Windows.Program"

type="win32"

>

<description> Your app description here</description>

<dependency>

<dependentAssembly>

<assemblyIdentity

type="win32"

name="Microsoft.Windows.Common-Controls"

Назад на стр. 069-120-2  Содержание  Вперед на стр. 069-120-4