Faq как написать маленький инсталлятор


Советы для написания программ-инсталляторов

Регистрация программ в меню Пуск Windows 95 * *

Подобная проблема возникает при создании инсталляторов и деинсталляторов. Наиболее простой и гибкий путь — использование DDE. При этом посылаются запросы к PROGMAN. Для этого необходимо поместить на форму компонент для посылки DDE запросов — объект типа TDdeClientConv. Для определенности назовем его DDEClient. Затем добавим метод для запросов к PROGMAN:

При вызове ProgmanCommand возвращает true, если посылка макроса была успешна. Система команд (основных) приведена ниже:
Create(Имя группы, путь к GRP файлу)
Создать группу с именем «Имя группы», причем в нем могут быть пробелы и знаки препинания. Путь к GRP файлу можно не указывать, тогда он создастся в каталоге Windows.
Delete(Имя группы)
Удалить группу с именем «Имя группы»
ShowGroup(Имя группы, состояние)
Показать группу в окне, причем состояние — число, определяющее параметры окна:
1-нормальное состояние + активация
2-миним.+ активация
3-макс. + активация
4-нормальное состояние
5-Активация
AddItem(командная строка, имя раздела, путь к иконке, индекс иконки (с 0), Xpos,Ypos, рабочий каталог, HotKey, Mimimize)
Добавить раздел к активной группе. В командной строке, имени размера и путях допустимы пробелы, Xpos и Ypos — координаты иконки в окне, лучше их не задавать, тогда PROGMAN использует значения по умолчанию для свободного места. HotKey — виртуальный код горячей клавиши. Mimimize — тип запуска, 0-в обычном окне, <>0 — в минимизированном.
DeleteItem(имя раздела)
Удалить раздел с указанным именем в активной группе
Пример использования:
ProgmanCommand(‘CreateGroup(Комплекс программ для каталогизации литературы,)’);
ProgmanCommand(‘AddItem(‘+path+’vbase.hlp,Справка по VBase,’+ path +’ vbase.hlp, 0, , , ‘+ path + ‘,,)’);
где path — строка типа String, содержащая полный путь к каталогу (‘C:\Catalog\’);

Как скопировать все файлы вместе с подкаталогами * *
Удаление каталога со всем содержимым * *
Определение базовой системной информации. * *

Часто при создании систем привязки программ к компьютеру или окон типа System Info или About Box необходимо определить данные о пользователе и о системе. Это можно сделать следующим образом (из примеров по Delphi — программа COA):

Как проинсталлировать свои шрифты? * *

Добавить шрифт (файл .fon, .fot, .fnt, .ttf) в систему можно следующим образом:

При этом не требуется никаких перезагрузок, после добавления шрифт сразу можно использовать. my_font_PathName : string ( не string[nn] для D2+) — содержит полный путь с именем и расширением необходимого фонта. После удаления фонта форточки о нем забывают. Если его не удалить, он (кажется) так и останется проинсталенным, во всяком случае, я это не проверял.

Вставить какую-нибудь программу (или данные) внутрь EXE файла * *

1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:

2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES-файл.
3. Далее в тексте нашей программы:

Как написать очень маленький инсталлятор ? * *

Мне понравился следующий вариант: главное приложение само выполняет функции инсталлятора. Первоначально файл называется Setup.exe. При запуске под этим именем приложение устанавливает себя, после установки программа переименовывает себя и перестает быть инсталлятором.
Пример:

Вполне очевидно, что вместо переименования можно запускать программу с различными ключами, например /INSTALL и /UNINSTALL. Я очень часто пользуюсь таким приемом, особенно в тех случаях, когда проект состоит из одного файла

Включение и выключение устройств ввода/вывода из программы на Delphi * *

Решение для Delphi 1
Иногда может возникнуть необходимость в выключении на время устройств ввода — клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве «наказания» при запуске программы по истечению срока ее бесплатного использования . . Однако наилучшее ее применение — отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода. Это элементарно сделать при помощи API:
EnableHardwareInput(Enable:boolean): boolean;
Enable — требуемое состояние устройств ввода (True — включены, false — выключены). Если ввод заблокирован, то его можно разблокировать вручную — нажать Ctrl+Alt+Del, при появлении меню «Завершение работы программы» ввод разблокируется.
Еще раз подчеркиваю, что это работает только в 16-ти разрядной D1. Исследования в отладчике показали, что функция по сути ничего не делает, только устанавливает некий флаг в памяти, явно отвечающий за блокировку клавиатуры/мыши.

Решение для Delphi 2+
По сложно объяснимым причинам фирма Microsoft удалила функцию EnableHardwareInput из 32-рарядных реализаций Windows и, следовательно, EnableHardwareInput стала недоступной в D2+. Однако научные изыскания (в ядре Windows при помощи отладчика) помогли мне найти ее аналог. Он не документирован в справке Borland, но кажется есть в последнем MSDN
Procedure BlockInput(ABlockInput : boolean); stdcall; external ‘USER32.DLL’;
Вызов данной функции c параметром true блокирует клавиатуру и мышь, с параметром false — разблокирует). Как и в случае с EnableHardwareInput блокировка снимается при нажатии Ctrl+Alt+Del.

Как программно создать ярлык? * *

Создать ярлык можно при помощи данной функции:

Наиболее распространенная задача — создание ярлыка на рабочем столе. Для этого необходимо определить полный путь к системной папке Windows Desctop через реестр и передать его в качестве параметра PathLink.

Оповещение приложения (или всей системы) о изменении WIN.INI * *

При изменении WIN.INI (например, изменении настроек хранителя экрана) необходимо уведомить систему (или конкретное приложение) о том, что WIN.INI изменен. Это можно сделать при помощи передачи приложению сообщения WM_WININICHANGE SendMessage(HANDLE, WM_WININICHANGE, 0, PCHAR(SECT_NAME)); При этом HANDLE равен или HANDLE приложения, или HWND_BROADCAST — рассылка всем приложениям. SECT_NAME задает имя секции WIN.INI, в которой произошли изменения. Если указать пустую строку (#0), то считается, что изменялись все секции, что естественно увеличивает время обработки и нагрузку на систему

Как удалить самого себя ?? * *

Широко известна проблема, связанная с тем, что невозможно удалить запущенный EXE файл. Следовательно, вознакает проблема при написании деинсталлятора — он удалит файлы программы, но кто удалит его (сам себя он удалить не может). На самом деле у данной проблемы есть два решения:
Решение при помощи BAT файла
1. Создаем в любой папке BAT файл del_prg.bat следующего содержания 2. Запускаем его
3. Завершаем работу EXE файла. BAT файл будет крутится по циклу до тех пор, пока ему не удатся удалить EXE файл. Затем он самоуничтожится — этому ничто не препятствует, т.к. bat файлыв могут стирать сами себя без проблем

Решение при помощи реестра
1. Создаем ключ в ветви реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce с любым именем, например del_self и значением del [полное имя и путь к EXE файлу]
2. Просим пользователя перезагрузить компьютер (или делаем это принудительно). Команда из ключа сработает при следующей загрузке и будет автоматически удалена из реестра

Написать очень маленький инсталлятор

Мне понравился следующий вариант: главное приложение само выполняет функции инсталлятора. Первоначально файл называется Setup.exe. При запуске под этим именем приложение устанавливает себя, после установки программа переименовывает себя и перестает быть инсталлятором.

Вполне очевидно, что вместо переименования можно запускать программу с различными ключами, например /INSTALL и /UNINSTALL. Я очень часто пользуюсь таким приемом, особенно в тех случаях, когда проект состоит из одного файла

Faq как написать маленький инсталлятор ?

ELSE IF WinFlags AND WF_PMODE > 0 THEN LabelWinMode.Caption := ‘Standard Mode’

ELSE LabelWinMode.Caption := ‘Real Mode’;

IF WinFlags AND WF_80x87 > 0 THEN

ELSE ValueMathCo.Caption := ‘Absent’;

ValueFSRs.Caption := Format(‘%d%% Free’, [Fmt1]);

ValueMemory.Caption := FormatFloat(‘,#######’, MemAvail DIV 1024) + ‘ KB Free’;

Как проинсталлировать свои шрифты?

Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом:

AddFontResource( PChar( my_font_PathName < AnsiString >) );

var ss: array [ 0..255 ] of Char;

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

Убрать его по окончании работы:

RemoveFontResource ( StrPCopy ( ss, my_font_PathName ));

SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );

При этом не надо никаких перезагрузок и прочего, после добавления фонт сразу можно использовать. my_font_PathName : string ( не string[nn] для D2+) — содержит полный путь с именем и расширением необходимого фонта. После удаления фонта форточки о нем забывают. Если его не удалить, он (кажется) так и останется проинсталенным, во всяком случае, я это не проверял.

Вставить какую-нибудь программу внутрь EXE файла

1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:

ARJ EXEFILE C:\UTIL\ARJ.EXE

2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES-файл.

3. Далее в тексте нашей программы:

procedure ExtractRes(ResType, ResName, ResNewName : String);

Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));

procedure TForm1.BitBtn1Click(Sender: TObject);

// Записывает в текущую папку arj.exe

ExtractRes(‘EXEFILE’, ‘ARJ’, ‘ARJ.EXE’);

Как написать маленький инсталлятор?

Мне понравился следующий вариант: главное приложение само выполняет функции инсталлятора. Первоначально файл называется Setup.exe. При запуске под этим именем приложение устанавливает себя, после установки программа переименовывает себя и перестает быть инсталлятором.


if UpperCase(ExtractFileName(Application.ExeName))=’SETUP.EXE’ then Application.CreateForm(TSetupForm, SetupForm) // форма инсталлятора

else Application.CreateForm(TMainForm, MainForm); // форма основной программы

Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается!

С помощью Image Editor из комплекта Delphi3 создаю ресурс содержащий иконки и добавляю его в свой проект. Как известно, одна иконка в ресурсе может иметь два вида 32×32 и 16×16, которые отображаются соответственно при выборе крупных и мелких значков. Я создаю оба изображения, но после компиляции отображается только 16×16 (при крупных значках оно растягивается). Как мне сделать так, чтобы отображались обе иконки?

1. Такая штука работает только под Win 95-98, а в NT вторая икона не учитывается

2. Для редактирования подобных иконок лучше использовать либо Borlad Resourse Workshop или Visual C++ (для иконок годится но для всего остального, извините!)

Работа с принтером.

Delphi имеет стандартный объект для доступа к принтеру — TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет «глюк» — не работают функции Draw и StrethDraw. Но эта проблема поправима — можно использовать функции API. Далее приведены основные поля и методы объекта Printers:

PROPERTY

Aborted:boolean — Показывает, что процесс печати прерван

Canvas:Tcanvas — Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст… Тут есть несколько особенностей, они описаны после описания объекта.

Fonts:Tstrings — Возвращает список шрифтов, поддерживаемых принтером

Handle:HDS — Получить Handle на принтер для использования функций API (см. Далее)

Orientation:TprinterOrientation — Ориентация листа при печати : (poPortrait, poLandscape)

PageHeight:integer — Высота листа в пикселах

PageNumber:integer — Номер страницы, увеличивается на 1 при каждом NewPage

PageWidth:integer — Ширина листа в пикселах

PrinterIndex:integer — Номер используемого принтера по списку доступных принтеров Printers

Printers:Tstrings — Список доступных принтеров

Printing:boolean — Флаг, показывающий, что сейчас идет процесс печати

Title:string — Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати

METODS

AssignPrn(f:TextFile) — Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.

Abort — Сбросить печать

BeginDoc — Начать печать

NewPage — Начать новую страницу

EndDoc — Завершить печать.

Procedure TForm1.Button1Click(Sender: TObject);

With Printer do Begin

Canvas.TextOut(100,100,’Это тест принтера . ‘);

Особенности работы с TPrinter

1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново

2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и, главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты «поедут».

3. У TPrinter информация о принтере, по видимому, определяются один раз — в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.

Определение параметров принтера через API

Для определения информации о принтере (плоттере, экране) необходимо знать Handle этого принтера, а его можно узнать объекта TPrinter — Printer.Handle. Далее вызывается функция API (unit WinProcs) : GetDevice(Handle:HDC; Index:integer):integer;

Index – код параметра, который необходимо вернуть. Для Index существует ряд констант:

DriverVersion — вернуть версию драйвера

Texnology — Технология вывода, их много, основные

dt_RasPrinter — растровый принтер

HorzSize — Горизонтальный размер листа (в мм)

VertSize — Вертикальный размер листа (в мм)

HorzRes — Горизонтальный размер листа (в пикселах)

VertRes — Вертикальный размер листа (в пикселах)

LogPixelX — Разрешение по оси Х в dpi (пиксел /дюйм)

LogPixelY — Разрешение по оси Y в dpi (пиксел /дюйм)

Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все.

Параметры, возвращаемые по LogPixelX и LogPixelY очень важны — они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера. Пример таких функций:

‘Этот текст печатается с отступом 30 мм от левого края и ‘+


’55 мм от верха при любом разрешении принтера’);

Данную методику можно с успехом применять для печати картинок — зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) — микроскопической.

1. В файл проекта (*.DPR) добавить строку <$D SCRNSAVE >после строки подключения модулей (Uses. ).

2. У окна формы убрать системное меню, кнопки и придать свойству WindowState значение wsMaximize.

3. Предусмотреть выход из хранителя при нажатии на клавиши клавиатуры, мыши и при перемещении курсора мыши.

Статьи 1
Советы по Delphi 1
Советы по работе с системой 1
Советы для написания программ-инсталляторов 1
Регистрация программ в меню «Пуск» Windows 95 1
Как программно создать ярлык? 1
Затенить кнопку «Закрыть» в заголовке формы 1
Копирование файлов 1
Как скопировать все файлы вместе с подкаталогами 1
Удаление каталога со всем содержимым 1
Определение системной информации 1
Как проинсталлировать свои шрифты? 2
Вставить какую-нибудь программу внутрь EXE файла 2
Как написать маленький инсталлятор? 2
Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается! 2
Работа с принтером. 2
Система 2
Внешние модули (DLL), нити 6
Советы по работе с реестром. 7
Использование некоторых ключей реестра 7
Работа с реестром в Delphi 1 7
Объект INIFILES — работа с INI файлами. 7
Советы по работе с графикой 8
Разное 9
Глюки 14
Создание редактора карт в стратегиях типа WarCraft 14
Шпаргалка по ресурсам Windows-32 (для Delphi) 18
Стандартная технология доступа к ресурсам 18
Внутренний формат ресурсов Windows 18
Описание формата ресурсов в MS PE COFF. 19
Дамп памяти (взят из PE.TXT) 19
API 20
Программирование на основе Win32 API в Delphi 20
1. Введение 20
2. Существующие решения 20
3. Принципы построения API-библиотеки 20
4. Библиотека WinLite 21
5. Пример программы на основе библиотеки WinLite 23
KOL 23
Состояние проекта KOL 23
FAQ 24
Часто задаваемые вопросы по Borland Delphi 24
Общие вопросы по Delphi и данному FAQ (часть 1) 24
Введение 24
Вопросы общего характера 24
Совместимость 26
Базы данных — Interbase и локальные данные 27
Базы данных — прочие SQL сервера 28
Общие вопросы по Delphi и данному FAQ (часть 2) 29
Базы данных — компоненты и VCL. 29
Компоненты и VCL 31
Общие вопросы по Delphi и данному FAQ (часть 3) 34
Object Pascal и Windows API 34
Разное 37
Полезные хитрости 38
Вопросы по Delphi 1.0 38
Вопросы общего характера 38
Delphi и Visual Basic 39
Базы данных 40
Object Pascal и Windows API 40
Компоненты и VCL 41
Разное 41
Вопросы по Delphi 2.0 41
Что нового в Delphi 2.0 по сравнения с Delphi 1.0? 41
Вопросы общего характера 41
Базы данных 44
Object Pascal и Windows API 44
Разное 44
Вопросы по Delphi 3.0 45
Вопросы общего характера 45
Object Pascal и Windows API 45
Delphi, С++ Builder и базы данных: вопросы и ответы 46
Delphi VCL FAQ 48

Лучшие электронные книги в формате fb2
Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

Faq как написать маленький инсталлятор ?

Как затенить кнопку [X] в заголовке формы.
Следующий текст убирает команду «Закрыть» из системного меню и одновременно делает серой кнопку [X] в заголовке формы:procedure TForm1.FormCreate(Sender: TObject);
var
HMenuHandle:HMenu;
begin
HMenuHandle := GetSystemMenu(Handle, False);
if (HMenuHandle <> 0) then DeleteMenu(HMenuHandle, SC_CLOSE, MF_BYCOMMAND);
end;

Как скрыть TaskBar?
procedure TForm1.Button1Click(Sender: TObject);
var
HTaskBar : THandle;
begin
HTaskBar := FindWindow(‘SHELL_TRAYWND’, nil);
ShowWindow(HTaskBar, SW_HIDE);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
HTaskBar : THandle;
begin
HTaskBar := FindWindow(‘SHELL_TRAYWND’, nil);
ShowWindow(HTaskBar, SW_SHOWNORMAL);
end;

Как отключить показ кнопки программы в TaskBar?
Внеся изменения (выделенные цветом) в свой проект вы получите приложение, которое не видно в TaskBar.

uses Forms,
Windows ,
Unit1 in ‘Unit1.pas’ ;

var
ExtendedStyle : integer;

begin
Application.Initialize;
ExtendedStyle:=GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or
WS_EX_TOOLWINDOW);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Как вставить какую-нибудь программу внутрь EXE файла?

Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:

ARJ EXEFILE C:\UTIL\ARJ.EXE

Компилируем его в ресурс при помощи Brcc32.exe.
Получаем RES-файл. Далее в тексте нашей программы:

procedure ExtractRes(ResType, ResName, ResNewName : String);
var Res : TResourceStream;
begin
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// Записывает в текущую папку ARJ.EXE
ExtractRes(‘EXEFILE’, ‘ARJ’, ‘ARJ.EXE’);
end;

Как закрыть чужую программу?

SendMessage(FindWindow(nil, ‘ заголовок окна ‘), WM_CLOSE, 0, 0);

Заголовок окна, например, у Вашей формы — это Form1.Caption.

Как отрубить показ файла в Ctrl-Alt-Del?

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall;
external ‘KERNEL32.DLL’;

procedure TForm1.Button1Click(Sender: TObject);
begin //Hide
if not (csDesigning in ComponentState) then
RegisterServiceProcess(GetCurrentProcessID, 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin //Show
if not (csDesigning in ComponentState) then
RegisterServiceProcess(GetCurrentProcessID, 0);
end;

Как написать маленький инсталлятор?

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

Application.Initialize;
if UpperCase(ExtractFileName(Application.ExeName))=’SETUP.EXE’ then
Application.CreateForm(TSetupForm, SetupForm) // форма инсталлятора
else Application.CreateForm(TMainForm, MainForm); // форма основной программы Application.Run;

Как из программы переключать языки?

Здесь переключатели на русский и на английский.

procedure SetRU;
var
Layout: array[0.. KL_NAMELENGTH] of char;
begin
LoadKeyboardLayout( StrCopy(Layout,’00000419′),KLF_ACTIVATE);
end;

procedure SetEN;
var
Layout: array[0.. KL_NAMELENGTH] of char;
begin
LoadKeyboardLayout(StrCopy(Layout,’00000409′),KLF_ACTIVATE);
end;

Как разместить прозрачную надпись на TBitmap?

procedure TForm1.Button1Click(Sender: TObject);
var
OldBkMode : Integer;
begin
Image1.Picture.Bitmap.Canvas.Font.Color := clBlue;
OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT);
Image1.Picture.Bitmap.Canvas.TextOut(10, 10, ‘Hi everybody’);
SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode);
end;

Как очистить содержимое Canvas?

Нарисовать прямоугольник любого цвета.

Как извлечь Red, Green и Blue компонент из определенного цвета?

Используйте функции Window API Get RValue(), GetGValue() и GetBValue().

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Canvas.Pen.Color := clRed;
Memo1.Lines.Add(‘Red := ‘ +IntToStr(GetRValue(Form1.Canvas.Pen.Color)));
Memo1.Lines.Add(‘Green := ‘ + IntToStr(GetGValue(Form1.Canvas.Pen.Color)));
Memo1.Lines.Add(‘Blue:= ‘ + IntToStr(GetBValue(Form1.Canvas.Pen.Color)));
end;

Как создать bitmap из пиктограммы (icon)?

Используя Bitmap.Canvas.Draw нарисовать пиктограмму на Bitmap.

procedure TForm1.Button1Click(Sender: TObject);
var
TheIcon : TIcon;
TheBitmap : TBitmap;
begin
TheIcon := TIcon.Create;
TheIcon.LoadFromFile(‘C:\Program Files\Borland\MyIcons\MYICO1.ICO’);
TheBitmap := TBitmap.Create;
TheBitmap.Height := TheIcon.Height;
TheBitmap.W > TheBitmap.Canvas.Draw(0, 0, TheIcon);
Form1.Canvas.Draw(10, 10, TheBitmap);
TheBitmap.Free;
TheIcon.Free;
end;

Как рисовать на рамке формы?

Для этого надо обработать событие WM_NCPAINT.
Ниже приводится код программы, в которой рамка формы обводится красной линией толщиной в 1 пиксел.

type
TForm1 = class(TForm)

private

procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPAINT;
public

end;


var
Form1: TForm1;

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);
var
dc : hDc;
Pen : hPen;
OldPen : hPen;
OldBrush : hBrush;
begin
inherited;
dc := GetWindowDC(Handle);
msg.Result := 1;
Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
OldPen := SelectObject(dc, Pen);
OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
Rectangle(dc, 0,0, Form1.Width, Form1.Height);
SelectObject(dc, OldBrush);
SelectObject(dc, OldPen);
DeleteObject(Pen);
ReleaseDC(Handle, Canvas.Handle);
end;

Как определить, нажаты ли клавиши Shift, Alt или Ctrl?

В приведенном примере показано, как определить, нажата ли клавиша Shift при выборе строчки меню. Пример также содержит функции проверки состояния клавиш Alt, Ctrl.

function CtrlDown : Boolean;
var
State : TKeyboardState;
begin
GetKeyboardState(State);
Result := ((State[vk_Control] And 128) <> 0);
end;

function ShiftDown : Boolean;
var
State : TKeyboardState;
begin
GetKeyboardState(State);
Result := ((State[vk_Shift] and 128) <> 0);
end;

function AltDown : Boolean;
var
State : TKeyboardState;
begin
GetKeyboardState(State);
Result := ((State[vk_Menu] and 128) <> 0);
end;

procedure TForm1.MenuItem12Click(Sender: TObject);
begin
if ShiftDown then Form1.Caption := ‘Shift’ else Form1.Caption := »;
end;

Как поместить JPEG-картинку в exe-файл и потом загрузить ее?

1) Создайте текстовый файл с расширением «.rc». Имя этого файла должно отличаться от имени файла-пректа или любого модуля проекта. Файл должен содержать строку вроде:
MYJPEG JPEG C:\DownLoad\MY.JPG
где: » MYJPEG » — имя ресурса, » JPEG » — пользовательский тип ресурса, » C:\DownLoad\MY.JPG » — путь к JPEG-файлу. Пусть, например, rc-файл называется «foo.rc». Запустите BRCC32.EXE (Borland Resource CommandLine Compiler) — программа находится в каталоге Bin Delphi/C++ Builder’а — передав ей в качестве параметра полный путь к rc-файлу. В нашем примере: C:\DelphiPath\BIN\BRCC32.EXE C:\ProjectPath\FOO.RC Вы получите откомпилированный ресурс — файл с расширением «.res». (в нашем случает foo.res). Далее добавьте ресурс к своему приложению.

procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture);
var
ResHandle : THandle;
MemHandle : THandle;
MemStream : TMemoryStream;
ResPtr : PByte;
ResSize : Longint;
JPEGImage : TJPEGImage;
begin
ResHandle := FindResource(hInstance, PChar(TheJPEG), ‘JPEG’);
MemHandle := LoadResource(hInstance, ResHandle);
ResPtr := LockResource(MemHandle);
MemStream := TMemoryStream.Create;
JPEGImage := TJPEGImage.Create;
ResSize := SizeOfResource(hInstance, ResHandle);
MemStream.SetSize(ResSize);
MemStream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
MemStream.Seek(0, 0);
JPEGImage.LoadFromStream(MemStream);
ThePicture.Assign(JPEGImage);
JPEGImage.Free;
MemStream.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
LoadJPEGFromRes(‘MYJPEG’, Image1.Picture);
end;

Как поместить курсор в определенную позицию TEdit?

Можно использовать методы Delphi SelStart() и SelectLength().

Как показать форму без передачи ей фокуса ввода?

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Form2.Visible := FALSE;
ShowWindow(Form2.Handle, SW_SHOWNA);
end;

Как уменьшить мерцание при перерисовке компонента?

Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента — то фон компонента перерисовываться не будет.

constructor TMyControl.Create;
begin
inherited;
ControlStyle := ControlStyle + [csOpaque];
end;

Как эмулировать движение мыши?

В примере мышка слегка «подталкивается» без участия пользователя.

procedure TForm1.Button1Click(Sender: TObject);
var
pt : TPoint;
begin
Application.ProcessMessages;
Screen.Cursor := CrHourglass;
GetCursorPos(pt);
SetCursorPos(pt.x + 1, pt.y + 1);
Application.ProcessMessages;
SetCursorPos(pt.x — 1, pt.y — 1);
end;

Как зарегистрировать расширение файла за своим приложением и контекстное меню, связанное с этим типом?

Как создать инсталлятор и деинсталлятор самостоятельно

Тот, кто будет утверждать, что самостоятельно создавать инсталлятор нет никакого смысла — для этого есть множество разных программ, начиная с монструозной Install Shield самой Delphi (правда, с красивым интерфейсом результата) и заканчивая творениями безвестных умельцев— будет прав и неправ одновременно. Прав — потому что действительно, все эти программы наличествуют, и пользоваться ими, по крайней мере, не сложнее, чем делать самому. А неправ— потому что самое трудное в создании инсталлятора заключается не в том, чтобы его написать, а в том, чтобы сделать это правильно. Ну и вообще — данная книга не о том, как пользоваться чужими программами, а о том, как писать свои. Поэтому мы будем делать все ручками. Кстати, а что именно делать? Мы в этой главе создадим инсталлятор для переключателя раскладки клавиатуры LangSwitch, и тем самым покончим и с ней. Для SlideShow и остальных наших программ мы инсталляторы договорились не делать, потому что они располагаются максимум в двух файлах (считая справку) и в систему не вмешиваются — так зачем для них инсталлятор? Побольше бы таких программ делалось— меньше было бы мусора в реестре и на диске, а манипуляторы типа «мышь» реже выходили бы из строя.

Но «переключалку» инсталлировать надо — там необходимо вносить изменения в системные настройки, хоть и минимальные, но заставлять делать это самого пользователя очень уж по-любительски. А раз инсталлировать — значит, и деинсталлировать. И так, чтобы ни следа не осталось! Я на своем веку встретил буквально пару-тройку программ, которые выполняли бы процедуру деинсталляции до конца корректно. Даже любимый браузер Firefox все почти делает правильно, а вот папку Mozilla оставляет почти пустой, но неубранной!

Я не буду вдаваться в тонкости устройства реестра, потому что это бессмысленно — даже раритетная книга [36], специально этому делу посвященная, охватывает едва ли треть необходимых сведений. Но почитать ее перед сном очень рекомендую— общие принципы знать никогда не мешает. Здесь же нам не придется даже понимать, какие бывают разновидности ключей и и\ параметров — мы просто воспользуемся чужим (моим) опытом и сделаем все по шаблону. Некоторые дополнительные пояснения я дам по ходу дела.

Заметки на полях

А как вообще стоит использовать реестр? Например, нужно ли переносить туда пользовательские установки? Отвечаю — нет, не нужно, хотя никто вам этого запретить не может. Но, например, регистрация списка последних открытых файлов может понадобиться вам для того, чтобы эти файлы отображались в системном меню Документы. Только для этого нужно не просто вести этот список в реестре, а принять еще некоторые меры, иначе любая программа- чистильщик реестра отнесет ваш список к неиспользуемым параметрам и будет совершенно права. Если же вам не надо ничего такого — мое мнение, что луч – ше вообще в реестр не соваться, а сохранять уствновки в старых добрых INI файлах, которые всегда под рукой. Пользователи ввм скажут только спасибо, если для удаления вашей программы достаточно стереть рабочую директорию вашего приложения со всеми файлами и забыть о нем. Можно еще использовать реестр для хранения секретных ключей — например, для предотвращения повторной установки shareware-nporpaMM с ограниченным сроком действия, но при этом следует помнить, что взломать твкую защиту куда проще, чем если вы, например, создадите безымянный секретный файлик где-нибудь в недрах системных папок. В остальном — мое глубоко выстраданное мнение заключается в том, что если реестр вообще для чего-то нужен (обходятся же без него в Unix и ничего себе живут), то для того, чтобы хранить системные установки (в широком смысле — автозапуск, например, тоже относится к системным установкам). И вмешиваться туда следует только с целью их изменения. О том, что это нужно делать с осторожностью, вы и твк знаете, но мы тут ничего обру- шающего систему до полной неработоспособности делать не намереваемся.

А теперь займемся составлением детального плана инсталляции и на его основе — деинсталляции.

Итак, при инсталляции нам требует ся:

I. Показать пользователю текст с описанием основной функциональности программы. Мы с вами не Microsoft, и лицензию демонстрировать не будем, но упомянуть о правах пользователя считается хорошим тоном. Неплохо, например, подпустить немного иронии в таком духе: «Все мысли, которые могут прийти в голову при чтении данной книги, являются объ’ ектом авторского права. Их нелицензированное обдумывание запрещено» (Пелевин). Тут же предложить выбор: устанавливать — не устанавливать. Выход из диалога: Начать установку, Прервать установку.

2. Указать папку, куда будут копироваться файлы программы, и предложить подтвердить или выбрать другую. Скопировать в выбранную папку файлы программы. Об организации процесса по пунктам I и 2 см. далее.

3. Предложить на выбор: убрать системный индикатор раскладки или не убирать. Запомнить для деинсталляции, демонстрировался ли системный индикатор или нет.

4. Если это Windows ХР, то сообщить, что будет отключен пункт Переключать раскладки клавиатуры (см. главу 7). Запомнить для деинсталляции состояние этого пункта.

5. Предложить на выбор: регистрировать программу в автозапуске или нет.

6. Зарегистрировать программу (точнее, ее деинсталлятор) в меню Установка и удаление программ.

7. Предложить перезапустить компьютер. Выход из диалога: Перезапустить сейчас, Закончить установку без перезапуска.

1. Продемонстрировать диалог: удалять — не удалять программу.

2. Вернуть системный переключатель и пункт Переключать раскладки клавиатуры в прежнее состояние.

3. Удалить программу из меню Установка и удаление программ и из автозапуска, если она там есть.

4. Удалить файлы, в том числе сам деинсталлятор, и папку программы. Если в ней имеются посторонние файлы, запросить пользователя разрешения на удаление. Примечание: то же самое нужно сделать при инсталляции программы, если пользователь прервет установку, только набор удаляемых файлов будет другой.

5. Продемонстрировать сообщение Удаление завершено и предложить перезапустить компьютер.

Как видите, никаких таких специальных Shield не требуется. Все небольшие

изменения в реестре, которые нам нужны, легко внести с использованием

объекта TRegistry. Пункт в главном меню программ у нас создавать не требуется, но если потребуется, то его легко включить по методике с использованием DDE, как указывается в заметке Олега Зайцева, продублированной на множестве ресурсов в Сети (например, здесь: http://www.delphimaster.ru/cgi-bin/faq.pl?look=l& >

Теперь решим вопрос с формой представления программы. Хотя файла всего два, все равно удобно использовать самораспаковывающийся (SFX) архив. WinRar, который я так обругал за излишне навороченный интерфейс в начале книги, умеет создавать отличные SFX-архивы с демонстрацией, что немаловажно, текста и диалога выбора перед распаковкой и всеми остальными «прибамбасами», включая выбор папки, демонстрацию линейки хода pacn.v ковки и т. п., так что для выполнения первых двух пунктов ничего выдумывать не придется. Задача нашей программы setup будет состоять в том, чтобы выполнить необходимые установки, начиная с пункта 3. Правда, если пользователь решит, что установку надо прервать на одном из последующих этапов, то, как указано ранее, подчищать за собой (удалять распакованные файлы и т. п.) придется уже нашей программе.

Заметки на полях

Если программа использует DLL, как в нашем случае, то их часто включают в перечень библиотек, запускаемых системно — аналог автозапуска для обычных ЕХЕ-файлов. Так как в данном случае никто, кроме нас, использовать нашу ловушку не будет, то замусоривать память нам абсолютно ни к чему, особенно это касается Windows ХР, которая имеет привычку «на всякий случай» хранить все единожды запущенные DLL в оперативной памяти. Но на другой «всякий случай» укажу ссылку на статью с хорошим примером, как это можно сделать http://msk.nestor.minsk.by/kgy2003/26/kg32602.html.


Разберем некоторые остальные пункты. Системный индикатор раскладки есть программа, которая носит странное имя internat.exe (находится в папке ..\WINDOWS\system32). Она просто присутствует в автозапуске и ее удаление оттуда не вызывает никаких проблем. Если же вы, несчастный, имели смелость (или глупость— как кому больше нравится) установить Office ХР (в любой из версий Windows), то эта программа заменяется на другую с не менее странным названием ctfmon.exe (на самом деле это так называемые «расширенные службы текстового ввода», включающие ввод текста голосом, распознавание рукописного ввода и т. п.). Причем в Windows ХР эта программа вместо internat.exe имеется изначально. Ее также можно спокойно удалять из автозапуска, хотя теоретически с этим могут быть проблемы (см. http://www.computery.ru/upgrade/faq/soft/2003/sfaq_l 12.htm). Перечень программ автозапуска находится во всех версиях Windows в реестре по адресу:

в 98-й и в ХР почему-то регистр названия «Software» разный (в ХР — заглавными буквами), но. к счастью, компонент TRegistry их не различает.

Включить нашу программу в автозапуск можно, добавив ее по тому же ключу. Разумеется, можно и просто добавить ее в папку Автозапуск, но в Windows ХР этих папок может быть так много, что проще один раз обратиться к реестру.

Отключение пункта Переключать раскладки клавиатуры (оставив отмеченным пункт Переключать нзыкн ввода, см. главу 7) в Windows ХР (и других системах, если вдруг этот пункт там появится после установки Office ХР — я это проверять не стал) делается заменой значения ключа Layout Hotkey по адресу HKEY_CURRENT_USER\Keyboard Layout\Toggle на 3 (изначально он имеет значение 1 или 2, и это значение надо запомнить для деинсталляции). Несмотря на цифровое значение, тип этого параметра — reg sz (строковый).

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersiori\Uninstall. В этом ключе должно быть два параметра: DisplayName (то имя, которое будет отображаться в меню) и Uninstallstring (путь к файлу с деинсталлятором). Оба параметра должны также иметь тип reg sz.

Ну, а теперь приступим — сначала к собственно программам. Создадим новый проект под названием, как и полагается, просто Setup (модуль назовем inst.pas— папка Glava 17\Setup) и скопируем в ту же папку с проектом три необходимых файла (из папки Glava 16\2): Langswitch.exe, LangHook.dll и LShelp.htm. Отметим, что отладка инсталляционной программы— весьма занудное занятие, при изменениях в реестре приходится всякий раз перезапускать компьютер, чтобы убедиться, что все правильно работает.

Форму уменьшим и придадим ее свойству BorderStyle значение bsDialog. В заголовке формы напишем Установка LangSwitch. Установим на форму два компонента checkBox (для фиксации состояний Удалить системный индикатор раскладки и Внести LangSwitch в автозапуск) и две кнопки Button (Продолжить и Прервать). У верхнего CheckBox! СВОЙСТВО Enable следует установить в False, у нижнего checkBox2 — в True. Оба компонента CheckBox отметим по умолчанию (Checked=True). После заполнения всех заголовков форма должна выглядеть так, как показано на рис. 17.1.

Список глобальных переменных будет таким: var

Formi: TForml; IniFile:TIniFile; Reg:TRegistry;

Рис. 17.1. Окно Setup для программы LangSwitch

В предложение uses внесем модули IniFiles, Registry и Shell API и присвоим проекту иконку самой программы LangSwitch (она находится в папке Glava7\2 в файле под названием Keyboard, ico). Далее создадим такой обработчик onCreate формы:

procedure TForml.FormCreate(Sender: TObj ect); begin st: = «;

if Openkeyi’SOHTWARE\Microsoft\Windows\CurrentVersion\Run’,False) then try

st:=ReadString(‘internet.exe 1 ) ; except try

CloseKey; Free; exit; end; end;

if sto» then CheckBoxl.Enabled:=True; st: = 1 ‘ ;

sf:TsearchRec; FlagLay:boolean-False; FlagRStrt:boolean»Falae> FlagDel:boolean=False;

if Openkey( 1 Keyboard LayoutXToggle’,False) then try (пункт Переключать раскладки клавиатуры)

st:=Read3tring(‘Layout Hotkey’); except

CloseKey; (нет такогоi

if sto” then FlagLay:–True; (есть такой) CloseKey; (подчистили I Free; end; end;

Здесь мы определяем, есть ли в автозапуске системный переключатель и существует ли параметр Layout Hotkey. Если системный переключатель имеется, то checkBoxi будет активирован.

Теперь сначала создадим процедуру, которую надо предпринять при нажатии кнопки Прервать. Напоминаю, что в этом случае мы должны не просто выйти из программы, но и удалить все ранее скопированные файлы и созданную папку. Если вдруг между началом установки и отменой в папке появились лишние файлы, то мы извинимся:

procedure TForml .Button?.C.lick (Sender: TObject); begin (прервать установкуi Forml.Hide;

ChDir(ExtractFilePath(ParamStr(O))); if FindFirst(‘*.*’,faAnyFile,sf)-0 then begin repeat if not FlagDel then if

(ANSIUpperCase(sf.Name)<>ANSIUpperCase(‘Langswitch.exe’)) and (ANSIUpperCase(sf.Name) oANSIUpperCaseCLangHook.dll’) ) and (ANSIUpperCase(sf.Name)oANSIUpperCase(‘LShelp.htm’)) and (ANSIUpperCase(sf.Name)OANSIUpperCase(‘Setup.exe’)) then begin

(в uninstall убрать setup.exe, добавить еще Langswitch.ini, SETUP.sav, uninstall.exe)

st:=’B папке ‘+ExtractFilePath(ParamStr(0))+’ ‘+#10+ ‘найден неизвестный файл ‘+sf.Naine+ ‘ Удалить все такие файлы?’; if Application.MessageBox(Pchar(st),’Ошибка

than break else FlagDel:=True; end;

DeleteFilelsf.Name) ; until (FindNext(sf)oO); FindClose(sf); try

RmDir(ExtractFilePath(ParamStr(0))); (удаляем весь каталогI except

st:=’Невозможно удалить папку’

+ExtractFilePath(ParamStr(0))+’ ‘; Application.MessageBoxtPchar(st),’Извините’,mb_OK); end; end; Halt; end;

После этого создадим отдельную процедуру, которая будет демонстрировать нам диалог при окончании установки:

procedure Endlnst; begin

if FlagRStrt then (нужен перезапуск) begin

st:= 1 Для окончания установки необходим перезапуск компьютера.’ +#10+’ Перезапустить его сейчас?’;

if Application.MessageBox(Pchar(st),’Установка Langswitch

завершена’,mb_QKCANCEL)=idOK then Win32Check(ExitWindowsEx(ewx_REBOOT,0)); end else

if Application.MessageBox(‘Установка завершена. Показать

справку? 1 , ‘Langswitch’,mb_OKCANCEL)=i,dOK then ShellExecute(Forml.Handle,’open’,’LShelp.htm’,

(запускаем саму программу:)

ShellExecute(Forml.Handle, ‘open 1 , ‘Langswitch.exe’,

nil, nil, SW_SHOWNORMAL);

DeleteFile(‘setup.exe’); Forml.Close; end;

Флаг FlagRStrt мы будем устанавливать в зависимости от того, внесли мы изменения в реестр или нет. Точнее, мы не будем его устанавливать в том случае, если в реестр внесены только изменения, касающиеся добавления

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

procedure TForml.ButtonlClick(Sender: TObject); begin (продолжить инсталляцию! Forml.Hide;


if (CheckBox.1.Enabled-True) and (CheсkBoxl.Checked) then begin (будем убирать системный переключатель I FlagRStrt:=True; (придется перезапускать! Reg := TRegistry.Create; with Reg do begin

Root key: =IIKEY_LOCAL_MACHINE; if Openkey(

1 Software\Microsoft\Windows\CurrentVersion\Run•, False) then try (системная переключалка клавиатуры)

st :=ReadStri.ng (‘internat.exe’) ; except try

st.: -ReadString (*ctfmon.exe’) ; except end; end;

if DeleteValue(st) then

(если успешно удалили, то запоминаем параметр) begin

IniFile:=TIniFile.Create(ChangeFileExt(ParamStr(0),’.sav’)); IniFale.WriteStringt’Run 1 ,’System»,st); IniFile.Dest roy; end;

CloseKey; (подчистили) Free; end;

end; (убрали системный переключатель) if FlagLay=True then

begin Iубираем пункт Переключать раскладки клавиатуры) FlagRStrt:=True; <придется перезапускать! Reg := TRegistry.Create; with Reg do begin

Root ke у:=HKEY_CURRENT_USER;

if Openkey(‘Keyboard Layout\Toggle’,False) then try <пункт Переключать раскладки клавиатуры) st:=ReadString(‘Layout Hotkey’); <запоминаем параметр) IniFile:=TIniFile.Create(ChangeFileExt(PararaStr(0),’.sav’)); IniFile.WriteString(‘Layout’,’Hotkey’,st); IniFile.Destroy;

WriteString(‘Layout Hotkey*,’3′); (успешно изменили) except end;

st:=’Будет отключен пункт «Переключать раскладки

клавиатуры».’+#10+’Подробности см. в справке Langswitch’; Application.MessageBox(Pchar(st),’Внимание!’,mb_0K); end;

if CheckBox2.Checked then begin <вносим нашу программуs автозапуск) Reg := TRegistry.Create; with Reg do begin

Rootkey:=HKEY_LOCAL_MACHINE; if Openkey(

st:=ExtractFilePath(Application.ExeName)+’Langswitch.exe’; WriteString(‘Langswitch.exe’, st); except end;

(вносим нашу программу в меню Установка-Удаление:) Reg := TRegistry.Create; with Reg do begin

Rootkey:=HKEY_LOCAL_MACHINE; if Openkey(

‘Software\Microsoft\Windows\CurrentVersion\Uninstall’, False) than

if CreateKey(‘Langswitch’) then begin

WriteString С’DisplayName*,’LangSwitch’); st:-ExtractFilePath(Application.ExeName)+’uninstall.exe’; WriteString(‘UninstallString’, st); end; end;

Как видите, писать инсталляционные программы — дело довольно муторное. Но это только первый из трех необходимых этапов. Второй этап — создание пока отсутствующей у нас uninstall.exe. Ее проект под тем же названием я поместил в отдельную папку (Glaval7\Uninstall). Создадим там точно такую же форму и поместим на нее две кнопки и компонент Label. По умолчанию на кнопках будут заголовки Удалить и Не удалять, a Labeli мы будем заполнять динамически, т. к. нам понадобится многострочный вывод (рис. 17.2).

procedure TForml.FormCreate(Sender: TObject); begin

Labeli.Caption:=’Вы действительно хотите удалить’+ it 10+’программу LangSwitch?’;

Рис. 17.2. Форма Uninstall для программы LangSwitch

Для этой программы все будет несколько проще, вот так будет выглядеть процедура onCreate:

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

prooedure TForml.Bu t ton2Cli ck(Sender: TObj ect); begin <не умалять ина перезагружать)

Тогда основная процедура по нажатию кнопки Buttoni будет такой (в ней выбор между действиями осуществляется в зависимости от ее заголовка, после внесения всех изменений он поменяется на Перезагрузить):

procedure TForml.ButtonlClick(Sender: TObject); begin <удалить t-imt перезагрузить) if Buttoni.Caption=’Удалить’ then begin

IniFile:=TIniFile.Create( 1 SETUP.sav’); Reg TRegistry.Create; Forml.Hide; <удаление из меню Установка-Удаление:) with Reg do begin

Rootkey:=HKEY_LOCAL_MACHINE; if Openkey(

‘Software\Microsoft\Windows\CurrentVersion\Uninstall’, False) then

with Reg do begin

if Openkey(‘Keyboard Layout\Toggle’,False) then try

CloseKey; (подчистили) end; end;

<возврат системных; переключателя:>st:=IniFile.ReadString(‘Run’,’System’, «); IniFile.Destroy; (больше не понадобится) if (st=’internet.exe’) or (st=’ctfmon.exe’) then begin

Rootkey;=HKEY_L0CAL_MACHINE; if Openkey!

‘Software\Microsoft\Windows\CurrentVersion\Run’,False) then try

st:=ExtractFilePath(Application.ExeName)+st; WriteString(ExtractFileName(st),st); except end;

CloseKey; (подчистили) end; and;

(удаление из автозапуска:) with Reg do begin

Root key:=HKEY_LOCAL_MACHINE; if Openkey(

‘Software\Microsoft\Windows\CurrentVersion\Run’,False) then DeleteValue(‘Langswitch.exe’); CloseKey; (подчистили) Free; end;

ChDir(ExtractFilePath(ParamStr(0))); if FindFirst(‘*.*’,faAnyFile,sf)=0 then begin repeat if not FlagDel then if

(ANSIUpperCase(sf.Name)oANSIUpperCase(‘Langswitch.exe’)) and (ANSIUpperCase(sf.Name)oANSIUpperCase(‘LangHook.dil 1 )) and (ANSIUpperCase(sf.Naae)OANSIUpperCase(‘LShelp.htm’)) and


(ANSIUpperCase(sf.Name)OANSIUpperCase(‘Langswitch.ini’)) and (ANSIUpperCase(sf.Name)OANSIUpperCase(‘SETUP.sav’)) and (ANSIUpperCase(sf.Наше)OANSIUpperCase(‘uninstall.exe’)) then begin

st: = ‘B папке ‘+ExtractFilePath (ParamStr (0) ) +’ ‘ +#10+ ‘найден неизвестный файл ‘+sf.Name+ ‘ Удалять все такие файлы?’; if Application.MessageBox(Pchar(st),

DeleteFile(sf.Name); until (FindNext(sf)<>0); FindClose(sf); try

RmDir(ExtractFilePath(ParamStr(0))); (умаляем весь каталогI except

st:=’Невозможно удалить папку ‘ +ExtractFilePath(ParamStr(0))+’ ‘; Application.MessageBox(Pchar(st),’Извините’,mb_0K); end;

end; (удалили папку) Forml.Show;

Labell.Caption:=’Для полного удаления программы’+#10+ ‘LangSwitch необходимо’+#10+ ‘перезагрузить компьютер.’+#10+ ‘Сделать это сейчас?’; Buttonl.Caption:=’Перезагрузить’; Button2.Caption:=’Не перезагружать’; exit; end; (Умалить/

if Buttonl.Caption=’Перезагрузить’ then Win32Check(ExitWindowsEx(ewx_REBOOT,0));

Остался третий этап — создание самораспаковывающегося архива. Я не буд> в подробностях объяснять, как это делается — все отлично и доходчиво объяснено в справке программы WinRar. В архив нам надо собрать следующие файлы:

Поля, которые нужно заполнить в процессе создания этого архива, такие:

Title=nporpaMMa LangSwitch Text (

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

Программа LangSwitch предназначена для переключения языковой раскладки клавиатуры с русского языка на английский и обратно. Программа дополняет работу системного переключателя, использующего сочетания клавиш Alt-Shift или Ctrl-Shift, тем, что позволяет задавать в качестве переключателя любую одиночную клавишу на клавиатуре. Работа программы основана на имитации нажатия установленной системной комбинации клавиш. Программа тестировалась в операционных системах Windows 98 и Windows ХР.

Дополнительно программа LangSwitch также позволяет отключать функцию клавиши Alt, как входа в меню Windows.

В процессе установки потребуется внесение изменений в системный реестр и последующей перезапуск Windows. Для удаления установленной программы LangSwitch обратитесь к пункту «Установка и удаление программ» в «Панели управления».

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

Path=LangSwitch Overwrite=l Setup=setup.exe

Сам архив я намеренно не разместил на диске — если читатель собирается его сделать, то сначала необходимо более тщательно оттестировать обе программы Setup и Uninstall. Я тестировал их только для двух имеющихся у меня ОС (русские версии Windows ХР Ноше Edition и Windows 98 SP2 — другой возможности у меня не было), но не могу исключить, что, несмотря на выполнение обеих программ в соответствии с рекомендациями MSDN, в какой- нибудь, например, Windows 2000, или английской версии Windows ХР, что-то может пойти наперекосяк. И если для обычных программ это не так страшно, то для программы Setup это очень критичный момеш — , что является еще одним лишним поводом для того, чтобы по мере возможности избегать создания инсталляторов вообще. Идеальный вариант— разместить программу и виде двух архивов — самораспаковывающегося с инсталлятором и простою ZIP, именно в расчете на два варианта и составлен модифицированный текст спрааки (файл LShelp.htm в папке Glava 17\Setup).

Как видите, все отлично можно сделать самостоятельно, не прибегая к специальным программам. Эти специальные программы могут вам помочь только в одном — не придется писать так много кода. Зато придется изучать конкретную программу, и в самом главном — построении логики работы инсталляции вам никто помочь все равно не сможет.

Источник: Ревнч Ю. В. Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

Путеводитель по системам для создания инсталляторов

Clickteam Install Creator 2

Компания Clickteam выпускает простые и дружелюбные продукты для разработчиков: например, Clickteam Fusion, The Games Factory, Multimedia Fusion. В этом же ряду находится программа Install Creator. Основное преимущество продукта — быстрое создание дистрибутива при помощи пошагового мастера.

Разделы настроек расположены в такой строгой последовательности в виде вкладок. Вначале указываются данные (Files), текстовое содержание диалогов (Wizard Text), формат окна (Window), дополнительные настройки (Options), настройки деинсталлятора (Uninstaller), размер дистрибутива (Build). После нажатия на Build запускается компиляция инсталлятора, остается лишь указать место его расположения.

Инсталлятор занимает 65 КБ, с учетом деинсталлятора это 105 КБ. Вдобавок к этому, в Install Creator применяется один из двух алгоритмов компрессии (zipper/ differentiator), оптимальный вариант определяется автоматически. При необходимости, данные можно поместить в пакет отдельно от инсталлятора.

Функциональность Clickteam Install Creator унифицирована, отсутствуют некоторые важные опции. Так, мультиязычность не поддерживается, русский язык в перечне локализаций и вовсе отсутствует. Интеграция со сторонними решениями не предусмотрена, поэтому работа с большими проектами (подразумевающими множество связей в системе) будет неудобной. Программа не позволяет создавать обновления, патчи. Впрочем, в последнем случае, можно использовать Patch Maker — разработку Clickteam.

В незарегистрированной версии Install Creator присутствует реклама. Профессиональная версия, помимо снятия этого лимита, позволяет включать в дистрибутив несколько редакций, устанавливать лицензионное ограничение для пользователя инсталлятора.

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

Actual Installer

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

Использование пошагового мастера не предполагается, но доступно окно параметров для нового проекта. Определив базовые сведения продукта, можно перейти в главное окно программы. Опции расположены в 5 секциях — «Общее», «Установка», «Диалоги», «Система» и «Реестр».

В разделе General (Общее) указывается информация о проекте, здесь же настраивается внешний вид мастера установки. В процессе установщик может проверять системные требования (такие как версия ОС, привилегии пользователя) и зависимости (Microsoft .NET Framework, Internet Explorer, Adobe Reader, Java, SQL Server и прочие). При отсутствии указанных компонентов, инсталлятор потребует от пользователя скачать и установить их.

В Installation («Установка») — расположение файлов и папок, расположение исполнимого файла, настройки процессов установки, обновления и деинсталляции. Оба процесса могут осуществляться в тихом режиме, не требуя вмешательства пользователя. В довесок к установщику, может использоваться мастер обновлений (Actual Updater).

Dialogs («Диалоги») предоставляют доступ к «начинке» разделов, включая текст лицензионного соглашения, readme файла, в том числе в формате RTF. Здесь же — выбор языков локализации, причем русский язык числится в списке. Ненужные разделы установщика легко отключить.

System («Система») — настройка системных изменений, вносимых при инсталляции: ярлыки, ключи реестра, переменные и пользовательские команды.

Register («Реестр») — установка файловых ассоциаций, переменных окружения, библиотек.

После выставления нужных опций достаточно нажать на кнопку Build Project — инсталлятор готов к запуску. В случае, если при создании инсталлятора была пропущена важная опция, при компиляции Actual Installer даст об этом знать и укажет на ошибку.

Резюме. Actual Installer включает в себя практически все стандартные параметры и опции проекта. Это «промежуточный» вариант между очень простыми (вроде Clickteam Install Creator) и более тяжеловесными решениями, о которых также пойдет речь.

CreateInstall

CreateInstall — инструментарий для создания установщиков. В его основу заложено две особенности — контроль над процессом установки и неограниченная расширяемость. Обе возможности реализованы благодаря языку программирования Gentee, применяемому для написания сценариев.

Интерфейс CreateInstall разбит на 3 вкладки — «Проект», «Скрипт установки» и «Скрипт деинсталляции». Первый раздел позволяет задать общие настройки инсталлятора: информация о продукте, поддерживаемые языки, пути, внешний вид. Дополнительно, инсталлятор можно защитить цифровой подписью и установить пароль.

«Проект» — не равноценная замена двух последующих разделов, т. е. для создания дистрибутива нужно тщательно настроить скрипты установки и деинсталляции. Соответствующие параметры отображаются в виде групп, можно отобразить их единым списком.

Дополнением для CreateInstall служит утилита Quick CreateInstall. Она значительно упрощает создание инсталлятора, предоставляя только базовые настройки проекта. Из Quick CreateInstall в дальнейшем проект можно импортировать в CreateInstall.

Код проекта не предназначен для самостоятельного редактирования, переноса в IDE-среду, экспорта. Хотя язык Gentee имеет отличный потенциал: как минимум, это переменные и функции, условные выражения и синтаксис, базирующийся на C, C++ и Java.

Существует 3 редакции программы — полная, light (простая) и бесплатная. Список различий между ними опубликован здесь. По большей части, отсутствующие функции бесплатной редакции программы видны при навигации по группам настроек скриптов.

Интерфейс и справка доступны на русском языке.

Резюме. CreateInstall — функциональная и доступная для понимания среда. Инструментарий CreateInstall не так уж и беден и позволяет обходиться собственными средствами. Но к недостаткам все же следует отнести замкнутость программы «в себе», подразумевая функции импорта и экспорта.

Advanced Installer

Advanced Installer основывается на технологии Windows Inslaller, позволяя создавать msi-, exe- и других видов дистрибутивов. Этому способствует продуманный интерфейс и работа с проектами. В Advanced Installer можно обнаружить немало возможностей, которых нет в других подобных комплексах, о чем ниже.


Примечательно, прежде всего, разнообразие проектов: сюда входят инсталляторы, Java-установщики, обновления, дополнения, модули слияния и другие. В разделе меню Installer собраны команды импорта проектов из Visual Studio, RAD Studio, Real Studio, Visual Basic. Здесь раскрывается потенциал Advanced Installer во взаимодействии с IDE-средами.

Для каждого из выбранных типов проекта предусмотрен детальный мастер настройки. Есть общие шаблоны — Simple, Enterprise, Architect или Professional. Большая часть проектов доступна только для определенных типов лицензии, общедоступные проекты обозначены как None в графе License Required.

Как уже сказано, при создании проекта можно воспользоваться пошаговым мастером, где, в частности, доступен выбор способа распространения пакета, языков локализации, настройка пользовательского интерфейса, ввод текста лицензии и другие опции. Advanced Installer позволяет выбрать вариант распространения программы — оставить данные без компрессии, разделить на CAB-архивы, сохранить в MSI и др., добавить цифровую подпись, потребовать ввод серийного номера и т. д.

Главное окно Advanced Installer (редактор проекта), в простом режиме отображения (Simple), содержит несколько секций:

  • Product Information (Информация о продукте) — ввод сведений о продукте, параметры установки.
  • Requirements (Требования) — указание аппаратных и системных требований, зависимостей ПО. Также имеется возможность создания пользовательских условий.
  • Resources (Ресурсы) — редактор ресурсов (файлов и ключей реестра).
  • Deployment (Развертывание) — выбор типа распространения продукта. Это может быть MSI, EXE или веб-инсталлятор. Для MSI, EXE ресурсы можно поместить отдельно от инсталлятора.
  • System Changes — переменные среды.

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

Для выполнения более сложных задач позволяется использовать пользовательские действия, EXE, DLL или скрипты, написанные на C, C++, VBS или JS. Для создания сценариев предусмотрен удобный редактор.

Однако следует отметить, что в режиме Simple доступна лишь малая часть разделов. Работая с Advanced Installer в ознакомительном режиме, есть смысл зайти в настройки и переключиться в другой режим работы с проектом. После этих действий становятся доступны новые подразделы редактора.

Резюме. Благодаря различным редакциям продукта (включая бесплатную), возможностям импорта, множеству шаблонов и схем, редактору проектов — Advanced Installer будет интересен широкой аудитории.

BitRock InstallBuilder

InstallBuilder — кроссплатформенная среда для создания инсталляторов. В перечень поддерживаемых систем входят: Windows ME — Windows 8, Mac OS X, FreeBSD, OpenBSD, Solaris (Intel & Sparc), AIX, HP-UX, IRIX, Linux (Intel x86/x64, Itanium, s390 & PPC). Инсталляторы доступны как для настольного, так и сетевого ПО. В первой части путеводителя уже рассматривался продукт IzPack, но для InstallBuilder характерна поддержка языков написания, включая не только Java, но и PHP, Perl, Python, Ruby, C/C++ и .NET/Mono.

Интерфейс программы доступен на русском языке. Для работы с проектом используется очень простая графическая оболочка. Присутствуют следующие секции с настройками:

  • Product Details («Информация о продукте») — информация о проекте.
  • Files («Файлы») — проводниковый интерфейс для добавления файлов
  • Advanced («Расширенные настройки») — наиболее интересный раздел, где, пожалуй, и раскрывается вся мощь BitRock Installer. Для работы с проектами используется формат XML (см. обзор WiX в первой части), возможна совместная работа, ручная настройка проектов с поддержкой сценариев. Встроенные действия позволяют автоматизировать процессы установки и объединять задачи, делая их доступными в несколько кликов. Таким образом можно проверять зависимости, добавлять переменные окружения, изменять реестр и файловую систему и прочее. Для редактирования сценариев используется встроенный, очень простой, XML-редактор.
  • Customization («Настройка») — настройка пользовательского интерфейса инсталлятора, переменных окружения, пост-установочных действий, платформ, разрешений и компрессии. Для сжатия применяется ZIP/LZMA-компрессия. Можно создать тихий установщик, работающий в текстовом режиме.
  • Packaging («Упаковка») — для отслеживания ошибок имеется встроенный дебаггер. При построении легко создать кроссплатформенный инсталлятор. На выходе он использует «родную» среду ОС (это относится к графическим системам Windows, KDE и Gnome).

Резюме. BitRock InstallBuilder рекомендуется, прежде всего, для создания кроссплатформенных продуктов. Сценарий, основанный на XML-спецификациях, удобен в обращении, проект легко импортировать и экспортировать для редактирования во внешней среде. Таким образом, на основе данного XML-сценария можно быстро генерировать инсталляторы для всех требуемых платформ.

InstallMate

InstallMate представляет собой инструментарий для создания дистрибутивов на основе Windows Installer. Основные особенности: интуитивная графическая среда, широкий выбор элементов установки, проверка зависимостей, детальная настройка внешнего вида инсталлятора, поддержка компонентов, локализаций и расширений. Дистрибутивы, созданные с помощью InstallMate, отличаются компактностью и скоростью работы.

Мастер создания нового проекта позволяет выбрать существующий шаблон и указать начальные параметры — языки локализации (один или несколько), имя продукта.

Можно импортировать созданный проект или воспользоваться редактором InstallMate. Кстати говоря возможности импорта не впечатлили: поддерживаются продукты компании Tarma и проекты Visual Basic.

Главное окно программы содержит разделы с параметрами, разделенные, условно, на три секции:

  • Общие настройки: детальная информация о проекте, программные зависимости, системные требования, компоненты, а также опции инсталлятора. В боковой панели Package можно также указать тип инсталлятора, компрессии, ссылку на скачивание (в случае с веб-инсталлятором), пароль на установку. В один инсталлятор можно добавить несколько пакетов.
  • Компоненты: включение в дистрибутив элементов и связей: это файлы и папки, ключи реестра, ini-конфиги, переменные среды, файловые ассоциации, COM-классы, сервисы.
  • Опции инсталлятора: с помощью редактора можно отредактировать текст диалогов. Предусмотрена гибкая настройка локализаций, InstallMate поддерживает 19 языков по умолчанию. Можно создать один дистрибутив с несколькими локализациями либо несколько проектов с одним языком. В этом же разделе доступны пользовательские действия, а также переменные — включая 250 предустановок. Расширить функциональность пакета можно с помощью расширений и DLL-библиотек.

Как было отмечено, при создании инсталлятора можно использовать шаблоны. Помимо шаблонов проектов, возможно создание пакетов на основе компонентов, определяя группы элементов. Из других опций стоит отметить скрытую и тихую установку и деинсталляцию, два типа сжатия (Deflate или LZMA).

Полный список функций представлен здесь.

Резюме. Профессиональная среда для создания инсталляторов с действительно удобным интерфейсом и быстродоступным инструментарием: можно оперативно переключиться с одного языка локализации на другой при создании дистрибутива, протестировать проект. Не хватает функционального пошагового мастера настройки, возможностей импорта. Сильная сторона — наличие всех стандартных функций, работа с переменными и действиями.

Faq как написать маленький инсталлятор ?

Скрытые команды ADB
adb -d Команда посылается только на устройство подключенное через USB.
Внимание: Выдаст ошибку, если подключено больше одного устройства.

adb -e Команда посылается на устройство в эмуляторе.
Внимание: Выдаст ошибку, если подключено больше одного эмулятора.

adb -s Команда посылается на устройство с указанным серийным номером:

adb -p Команда посылается на устройство с указанным именем:
Если ключ -p не указан, используется значение переменной ANDROID_PRODUCT_OUT.

adb devices Список всех подсоединенных устройств.

adb connect [: ] Подсоединиться к андроид хосту по протококу TCP/IP через порт 5555 (по умолчанию, если не задан).

adb disconnect [ [: ]] Отсоединиться от андроид подключенного через TCP/IP порт 5555 (по умолчанию, если не задан).
Если не задан ни один параметр, отключиться от всех активных соединений.

adb push Копировать файл/папку PC->девайс.

adb pull [ ] Копировать файл/папку девайс->PC.

adb sync [ ] Копировать PC->девайс только новые файлы.
Ключи:
-l Не копировать, только создать список.

adb shell Запуск упрощенного unix shell.
Примеры использования

adb emu Послать команду в консоль эмулятора

adb install [-l] [-r] [-s] Послать приложение на устройство и установить его.
Пример: adb install c:/adb/app/autostarts.apk Установить файл autostarts.apk лежащий в папке /adb/app/ на диске с:
Ключи:
-l Блокировка приложения
-r Переустановить приложение, с сохранением данных
-s Установить приложение на карту памяти

adb uninstall [-k] Удаление приложения с устройства.
Ключи:
-k Не удалять сохраненные данные приложения и пользователя.

adb wait-for-device Ждать подключения устройства.

adb start-server Запустить службу/демон.

adb kill-server Остановить службу/демон.

adb get-state Получить статус:
offline Выключен.
bootloader В режиме начальной загрузки.
device В режиме работы.

adb get-serialno Получить серийный номер.

adb status-window Непрерывный опрос состояния.

adb remount Перемонтировать для записи. Требуется для работы скриптов, которые изменяют данные на.

adb reboot bootloader Перезагрузка в режим bootloader.

adb reboot recovery Перезагрузка в режим recovery.

adb root Перезапуск демона с правами root

adb usb Перезапуск демона, прослушивающего USB.

adb tcpip Перезапуск демона, прослушивающего порт TCP.

adb ppp [параметры] Запуск службы через USB.
Note: you should not automatically start a PPP connection. refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
Параметры:
defaultroute debug dump local notty usepeerdns

В выпускаемых устройствах эта функция отключена, так как поддержка USB была отключена в загрузчике. Для полнофункционального использования fastboot у вас должен быть инженерный SPL, или SPL с отключенным Security flag (S-OFF).

SPL – это второй программный загрузчик. В сочетании с IPL, составляют загрузчик устройства. Помимо начальной загрузки Android, загрузчик также выполняет различные диагностические функции. Одна из этих функций управления данными во внутренней флэш-памяти устройства. В зависимости от установленного загрузчика SPL, пользователь сможет прошивать подписанные NBH файлы, образы флэш-памяти NAND и многое другое. Обратите внимание, что SPL установлен и работает, независимо от Android, который работает поверх его. IPL – это программа начальной загрузки. Первоначальные загрузки/инициализации оборудования. Примерно то же, что BIOS компьютера.
Проверить, доступен ли нам fastboot можно перезагрузив HTC в загрузчик adb reboot bootloader. В верхней строке, вы должны увидеть S-OFF (безопасность выключена). Если вы видите S-ON, или вы видите фон с четырьмя цветами радуги, SPL не поддерживает fastboot. Вам нужно будет установить fastboot совместимый с SPL.

Внимание! При подключении HTC в режиме bootloader необходимо еще раз установить драйвера Android 1.0 (не знаю почему именно так отображается в диспетчере устройств). Процедура почти аналогична описанной выше. Устанавливаются те же драйвера, только выбирается строчка не ADB, а FASTBOOT.


fastboot devices Список присоединенных устройств в режиме fastboot.
fastboot flash Прошивает файл .img в раздел устройства.

fastboot erase Стереть раздел.
Разделы: boot, recovery, system, userdata, radio
Пример: fastboot erase userdata Стирание пользовательских данных.

fastboot update Прошивка из файла имя_файла.zip

fastboot flashall Прошивка boot + recovery + system.

fastboot getvar Показать переменные bootloader.
Пример: fastboot getvar version-bootloader Получить версию bootloader.

fastboot boot [ ] Скачать и загрузить kernel.

fastboot flash:raw boot [ ] Создать bootimage и прошить его.

fastboot devices Показать список подключенных устройств.

fastboot continue Продолжить с автозагрузкой.

fastboot reboot Перезагрузить аппарат.

f astboot reboot-bootloader Перезагрузить девайсв режим bootloader.
Перед командами fastboot можно использовать ключи:
-w стереть данные пользователя и кэш
-s Указать серийный номер устройства.
-p

Указать название устройства.
-c Переопределить kernel commandline.
-i Указать вручную USB vendor id.
-b Указать в ручную базовый адрес kernel.
-n

Указать размер страниц nand. по умолчанию 2048.

Команду logcat можно использовать с машины разработки
$ adb logcat
или из удаленного shell
# logcat Каждое сообщение лога в Android имеет тэг и приоритет
Тэг – это строка указывающая компонент системы, от которого принято сообщение (например: View для системы view)
Приоритет – имеет одно из нижеследующих значений (в порядке от меньшего к большему):
V — Verbose (Низший приоритет).
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (Наивысший приоритет, при котором ничего не выводится).

Получить список тэгов, используемых в системе, вместе с их приоритетами можно запустив logcat. В первых двух столбцах каждого из выведенных сообщений будут указаны / .
Пример выводимого logcat сообщения:
I/ActivityManager( 585): Starting activity: Intent

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

Пример ниже выводит в лог все сообщения с тэгом «ActivityManager» с приоритетом «Info» или выше, и сообщения с тэгом «MyApp» и приоритетом «Debug» или выше:
adb logcat ActivityManager:I MyApp:D *:S
Последний элемент в выражении фильтра *:S устанавливает приоритет «silent» для всех остальных тэгов, тем самым обеспечивая вывод сообщений только для «View» и «MyApp». Использование *:S – это отличный способ для вывода в лог только явно указанных фильтров (т.е. в выражении фильтра указывается «белый список» сообщений, а *:S отправляет все остальное в «черный список»).

При помощи следующего выражения фильтра отображаются все сообщения с приоритетом «warning» или выше для всех тэгов:
adb logcat *:W

Если logcat запускается на машине разработчика (не через удаленный adb shell), можно также установить значение выражения фильтра по умолчанию задав переменную окружения ANDROID_LOG_TAGS:
export ANDRO

Следует обратить внимание что задав переменную окружения ANDROID_LOG_TAGS она не будет работать в эмуляторе/устройстве, если вы будете использовать logcat в удаленном shell или используя adb shell logcat.
Вышеописанная команда export работает в ОС *nix и не работает в Windows.

Контроль формата вывода лога

Сообщения лога в дополнение к тэгу и приоритету содержат несколько полей метаданных. Можно изменять формат вывода сообщений показывая только конкретные поля метаданных. Для этого используется параметр -v и указывается один из ниже перечисленных форматов вывода.

brief Показывать приоритет/тэг и PID процесса (формат по умолчанию).
process Показывать только PID.
tag Показывать только приоритет/тэг.
thread Показывать только процесс:поток и приоритет/тэг.
raw Показать необработанное сообщение, без полей метаданных.
time Показывать дату, время вызова, приоритет/тэг и PID процесса.
long Показывать все поля метаданных и отдельно сообщения с пустыми строками.

При запуске logcat можно указать формат вывода используя параметр -v:
adb logcat [-v

Faq как написать маленький инсталлятор ?

На примере игры ”Gromada”

0) Устанавливаем игру в любую директорию. Устанавливаем программу Inno setup и запускаем.

1) В окне выбираем «Create a new script file using the Script Wizard«

2) Далее нажимаем «Next«

3) Application name — Имя программы — Здесь пишем название игры.(В примере это будет: Gromada)
P.S. Если игра на русском языке, лучше всеравно написать на английском, потому что некоректно она может работать.
Application name including version — Имя программы с версией — В принципе здесь можно написать просто название игры, но если вы знаете версию ее то можно и написать.
Application publisher — Издатель программы — Можно оставить без текста, или написать Smallgames
Application website — Сайт программы — Здесь и обьяснять нечего. (Напишите: www.smallgames.ws)
Когда все заполнили нажимайте «Next«

4)Application destination base folder — Папка установки программы — По умолчанию стоит «Program Files folder» — это значит что игра установится в папку Program Files на системном диске. — Я бы не советовал менять.
Application folder name — Имя папки программы — По умолчанию ей присваивается такое же имя что и игре. Оставим без именения.
Allow user to change the application folder — Разрешить пользователю выбирать куда устанавливать игру — Чтобы небыло критики лучше оставить галочку.
The application doesn’t need a folder — Не создавать папку для программы — Если вы поставите галочку то игра установится в папку Windows.
После изменений нажимаем «Next«

5)Application main executable file — Запускаемый файл(ексешник) программы — Здесь нажимает «Browse» и выбираем файл ***.exe (* — любое имя ексешника), с него игра будет запускатся.(В примере — gromada.exe)
Allow user to start the application after Setup has finished — Разрешить пользователю запустить программу после окончания установки — Для удобства можно оставить галочку.
The application doesn’t have a main executable file — Программа не имеет запускаемого файла — Если вы создаете для инсталлятор для игры или программы, то он обязательно будет.
Other application files — Другие файлы — Ведь игры не только состоят из одного ексешника. Тут то мы и добавим другие файлы. Нажимайте кнопку «Add folder» и выбирайте папку с игрой. (В примере — C:\Program Files\Gromada\*)
Далее выскочит окошко, там нажмите Да
Теперь с чистой совестью жмем «Next«

6)Application Start Menu folder name — Имя папки программы в меню Пуск — Тут также автоматически присваивается имя игры, тоесть менять не требуется.
Allow user to change the Start Menu folder name — Разрешить пользователю изменять имя папки в меню Пуск
Allow user to disable the Start Menu folder creation — Разрешить пользователю не создавать папку в меню Пуск
Create an Internet shortcut in the Start Menu — Создать ярлык на сайт в меню Пуск
Create an Uninstall icon in the Start Menu — Создать иконку дезинталяции в меню Пуск — Для удобства пользователей надо поставить.
Other main executable icons — Другие ярлыки
Allow user to create a desktop icon — Разрешить пользователю создавать ярлык на рабочем столе.
Allow user to create a Quick Launch icon — Разрешить пользователю создавать ярлык на панели задач.
После выстовления галочек нажимаем «Next«

7)License file — Лицензионное соглашение — Кто нибудь его читал?
Information file shown before installation — Показать информацию до установки — Пригодится если к игре есть примечание, например сериальный номер.
Information file shown after installation — Показать информацию после установки
P.S. поддерживаются только файлы .txt, .rtf
Жмем «Next«

8 )Languages — Языки — Здесь вы можете выбрать на каких языках будет инсталлятор(есть русский). Нажимаем по нужным и не нужным.
Как вы могли догадатся, опять жмем «Next«

9)Финишная прямая.
Custom compiler output folder — Выбор папки для сохранения инсталлятора
Сompiler output base file name — Имя инсталлятора
Custom Setup icon file — Выбор иконки для инсталлятора — Поддерживаются только .ico
Setup password — Пароль инсталлятора — Если его ввести, то установка не начнется без его ввода(Я бы не советовал его ставить, вдруг забудите)
Нажимаем заветную «Next«

10) И заветная ПОБЕДА!
Нажимаем «Finish» и «Да«. Получили готовый инсталлятор в папке куда его вы сохранили(п.9)

Bonus) Примечание:
Если вы хотите чтоб лучше сжалась игра, то в коде «Compression=lzma» дописываем «/ultra«

Как сделать установщик своей программы?

06.02.2012, 22:26

Как создать установщик программы
Слышал что установочник можно стелать с помощью Setup Project, но ничего подобного со словом.

Как сделать установщик для службы Windows
Пишу службу Windows на MS Visual C# 2010, экспресс выпуск. В инете инфы нарыл много, но везде.

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

Как из своей программы отправить сообщения в Skype
Доброго времени! Вопрос, который тревожит мой мозг уже наверное с месяц: Как из своей программы.

Про свою работу инсталлятором.

Много читал тут про то, как люди работают монтажниками (это те, кто инет проводит) но правильнее все же эту профессию назвать инсталлятор. По крайней мере нас именно так и называют на работе. Я работаю на очень большого провайдера, по договору подряда. И конечно тут все должны понимать почему именно договор подряда. Ибо в сим договоре, русскими буквами прописано, что все работы, инсталлятор проводит на свой страх и риск (тебя током убило, но мы отвечать за сие не будем, ты свалился с крыши, а надо было аккуратней быть). Работа порой опасная, позже постараюсь написать почему, но мне лично нравится. А по сему этот пост (кстати мой первый пост на пикабу), не нужно считать нытьем, просто желание поделится чем то, может даже кому то полезно будет. Итак, я устроился в большую контору, в городе N, для того чтоб более менее зарабатывать. До этого ни разу инет не проводил ни кому. Там пообещали дать кой какие навыки, а потому на следующий день, сразу начали обучение. Нет не в офисе, а сразу практика. А именно как наверное и везде, стал помогать одному мастеру. Долго я не обучался. Два дня хватило чтоб понять что к чему. Тот тоже особо не рассыпался в объяснениях, просто работал а я помогал. По большей части молча. Вопрос-короткий ответ-понятно. Конечно очень много нюансов осталось для меня темным лесом, но я самоуверенно понадеялся на соображалку и смекалку. А значит подписал договор. Тут нужно отметить, что у инсталлятора сто процентная сделка. Как поработал, так и полопал. Никому не интересно что у тебя может личный финансовый кризис, куча долгов и прочие проблемы. Все расписано по балам, а те в рублях. На каждую заявку, прописывается фронт работ и каждый твой чих, стоит столько то в баллах, а баллы стоят столько то рублей. И тут не чего лично, просто бизнес такой. И по моему это правильно. Надо мной ни кто не стоит, меня ни кто не караулит. Я сам по себе. Захотел отдохнул, покурил, пошел поел, ушел домой спать. Тут конечно нужно самому рассчитывать свое время, но помнить, что если заявка прописана например с 9. 00. до 12. 00. то она должна быть активирована именно в этот интервал. Не раньше не позже. Просрочил на одну минуту? Держи штраф в косарь. Тут наверное нужно пояснить, что не всегда и за 3 часа можно кинуть кабель до абонента. И вот почему. Абонент допустим живет на 22 этаже. Коммутатор находится в подвале. Стояков нашей конторы там нет. А это значит, что кабель нужно будет тянуть по общему стояку, который находится там, где счетчики. Не много правее, там предусмотрен слаботочный отсек. Вот по нему то тащишь кабель. А там не все просто. Ибо тогда нужно будет попасть на каждый этаж. Сверху вниз. Но народ практически во всех домах, поставил бронированные тамбурные двери, стараясь как можно тщательнее изолироваться от окружающего мира, блуждающих вороваек, бомжей и тусящих по подъездам нариков. Больше того: многие навесили замки на сами щитовые, наверное пытаясь себя предохранить от. от чего даже не знаю. Может кто то в шапочке из фольги, думает что у него крадут электричество, может еще что. не знаю в общем, но факт имеет место быть. Вот и стоишь и думаешь, как попасть в тамбур, как попасть в счетчик. Часто ведь двери установят, а вот звонка нет ни на одной из четырех квартир. Просо глухая дверь и все. Я часто задавался вопросом, а что если все на работе, а в это время в щитовой закоратит? Как туда попадет электрик, и не дай Бог пожарные? Но не суть. Так что мне кажется эти тамбурные двери не совсем по правилам расположены. Это мягко говоря. Но жильцы так не думают. Более того, они уверенны, что тамбур это их частная собственность. Мне всегда было интересно, частная собственность конкретно кого из четырех квартир?))) Кто такой богатый, что вместе с квартирой, купил себе еще и тамбур, по которому ходят его соседи и который обслуживает УК. Особенно позабавил один случай: Тяну линию на одном из этажей. Как всегда тамбур, но есть один звонок. Я звоню в него, типа это монтажник провайдера N, мне нужно к щитовой попасть, дабы протяжку пропустить. За дверью голос перепуганной то ли узбечки, то ли таджички. Мол щас одну секунду. Открывает дверь, типа хозяйки нет, пустить не могу. Я говорю что в квартиру к ним не собираюсь заходить, только счетчик на общедомовой территории и всего на пару минут. Девушка отступает внутрь тамбура, я иду к щитку. Начинаю просовывать протяжку, которая уже чуть выше висела. Протяжка идет плохо, но идет. Тут сзади, раздаются быстрые шаги и практически рев » я же говорила тебе не пускать ни кого в тамбур!» Оглядываюсь, вижу это вероятно хозяйка квартиры. Белокурая женщина, лет 35, в гламурном розовом халате. Тут она подбегает ко мне и в ужо начинает орать кто я такой и что мне тут нужно. Поворачиваюсь, все быстро объясняю, показываю удостоверение что я официальный представитель и специалист от такой то компании. На что она заявляет, что это территория, принадлежит лично ей и она меня тут видеть не хочет. Я понимаю что она не совсем адекват и протяжку нужно быстрее протягивать. Одновременно проталкивая протяжку между бетоном, я ей пытаюсь объяснить что это не ее частная территория, а общедомовая. Она спорит, орет прямо в ухо, что если квартира ее, то ее и тамбур. Я ей говорю, что в тамбуре, меняет лампочки УК, что убирает его УК, что все проблемы с тамбуром решает УК. А не Вы за свой счет как в своей квартире. Управляющая компания разрешила нашему провайдеру пользоваться общим стояком, так что претензии тетеньки мне не ясны. В ответ на это, тетя переходит в рукопашную и пытается оторвать меня от протяжки, которая к слову во что то уперлась и лезть на этаж ниже не хочет. Тетя естественно слабее меня на много и оторвать меня не может от щитка. Я же стараюсь сделать свое. И вот протяжка юркнула легко ниже. Ура блин! Ибо тетя уже орала что у нее из за меня сломался ноготь, пальцы, голова и прочее по списку. Что я на нее напал, избил, изнасиловал, оскорбил, и даже в каком о месте признался ей в любви. Я отскакиваю от щитка. Та видит что я таки протолкнул протяжку и начинает ее тянуть вниз, тем самым помогая мне. При этом орет, что все равно не даст мне свои провода тут тянуть. Видимо в пылу скандала, она думала что кабель идет не сверху вниз, а снизу вверх. А потому яростно толкала протяжку ниже. Кстати делала она это удачно и протяжка ушла практически вся! 15 метров. Я с улыбкой на лице сказал «аминь» и начал выходить. Тетя поняла что лоханулась. Мне было уже весело и я поблагодарив за помощь, пошел на выход. Тебя побежала мыть руки от бетонной крошки и известки, предварительно закрыв щитовую. Уже на первом этаже, после того как дотащил провод до подвала, у консьержки спрашиваю, типа что за сумашедшая. А та с грустью выдает «да вы не обращайте на нее внимания, она юрист и больная на голову».))) Хотя такие случаи редкость конечно, и как правило люди с пониманием открывают. Типа закончите, постучите чтоб двери закрыть ибо украдут велосипеды. Ели нет, то я извещаю абонента, на каком этаже ему желают и зла и оставляют без инета.

«Подвал» Это место загадочно и не постижимо. Ибо попадая туда, ты попадаешь в мир труб, канализаций, непонятных звуков, блох, тараканов, клопов, запахов и прочих сомнительных прелестей. Подвалы бывают разные. Конечно с новыми домами работать интереснее. Там как правило нет насекомых и не воняет. В них нет ничего экстраординарного. Разве что там стоят новые пластиковые трубы и когда человек у себя в туалете смывает, грохот стоит такой, как будто он ел кирпичи. Но в основном с новыми домами проблем нет, за ними смотрят УК и вполне не плохо. А вот старые дома, это целая философия. Ибо там, в одном подвале есть весь вышеперечисленный набор насекомых, нет света, прорвало канализацию, искрит над головой 380 вольт, в них нужно передвигаться на корточках, ибо они как правило не высоки и за одно преодолевать препятствия в виде труб разной направленности. Порой доходило до того, что в прямом смысле ты ползешь на пузе, в кромешной тьме с фонарем, где температура 80 градусов тепла, попутно избегая коротких замыканий (их видно как они искрят в темноте на массу), распугивая крыс, кошек (которые часто живут там вместе не конфликтуя), убивая на лице комаров и терпя блох, которые по тебе скачут. В самых узких отверстиях часто торчит заостренная арматура, а значит нужно изловчиться и не порвать одежду. Часто ступая по полу в таких подвалах, можно наблюдать как пол «разбегается» под тобой, ибо пол весь усеян насекомыми, какими и знать не хочется. Дело прошлое, выйдя из такого подвала, я обнаружил, что в буквальном смысле я весь в блохах. Их была тьма! Они пытались кусать одежду и не прокусывая плотную ткань, искали щель чтоб пробиться к бренному телу. Благо тогда я был с напарником и он в тот подвал не заходил. Я его отправил в квартиру к абоненту, а сам пошел в УК сдавать ключи. Тут нужно пояснить, что еще до того как нам прийти к абоненту, мы заходили в управляющую копанию за ключами от подвала. Тетка, которая этим там занимается, долго не давала эти ключи, ссылаясь на то, что наш брат монтажник в подвале «своих соплей» навешал и пройти там теперь не возможно. Только через более высокое руководство, ключи ее заставили выдать (ибо провайдер очень большой и авторитетный). Попадя в подвал, проводов, которые висят как попало я не нашел (мы часто друг за другом подбираем не закрепленные провода во избежание конфликтов и проблем), но тут все было по этой части в порядке. Но подвал был загажен до не могу. То есть там было практически все как я выше описал. И блохи. Кучи и тучи этих насекомых. Их там никогда ни кто не травил. И вот с этими теперь уже моими спутниками, я намеренно не отряхиваясь и не поливая себя дихлофосом, двинул в УК. Придя туда и стараясь по дороге меньше терять сидящих на мне, переезжающих насекомых, я с порога заявил, что принес им блох из подвала. Тетки в УК заорали что им этого добра не нужно, на что я заявил что поздно, это блохи меня сюда принесли. Мне было весело наблюдать, как эти переселенцы не найдя на моей одежде не чего вкусного, соскакивают с меня и бегут радуясь осваивать новые владения с жирными тетками. Уж они то явно вкуснее))). Через неделю, этот подвал был весь усыпан отравой.

«Манагеры». Это отдельный отдел коммерсантов, занимающийся обзвоном потенциальных абонентов и заводящий заявки на подключение. К ним у большинства инсталляторов и абонентов (часто не состоявшихся), отдельные претензии. Ибо как правило, эти люди набираются с улицы и многие из них мало что понимает в роутерах, способах подключения, совместимости оборудования и прочем. А потому, обещая самые низкие тарифы в городе (в действительности так и есть), они попутно обещают манну небесную, кучи золота которые принесет им волшебник инсталлятор, и халяву вплоть до того, что попутно инсталлятор починит им холодильник и сделает ремонт в квартире. Естественно это не так. Я сделаю все бесплатно, только в рамках обозначенной сметы. И не более того. А по смете я просто заведу 20 метров кабеля в квартиру абонента, обожму его, подключу напрямую к компу (если роутер не входит в комплект подключения), настрою комп и уйду. Кабель абонент будет по плинтусам и стенам прятать сам. Бывало я полностью сам прятал кабель, прокладывал его по стенам и плинтусам и бесплатно, но только старикам и инвалидам. А воющий здоровый конь, что он не может, меня ни как не растрогает. Если у него есть роутер, который тяжело настраивается и не рекомендован, то абонент будет его так же настраивать сам. Нет, я могу настроить все что угодно и как угодно, но только за дополнительную плату. Ибо терять время, на роутер неизвестного происхождения я не стану. Ибо у меня еще адреса куда я должен успеть. Ели я задержался хоть на одном адресе выше отведенного времени, то это время естественно уже другой заявки, а значит есть риск не успеть, а значит есть риск штрафа. А рисковать мне просто так не хочется. В смете нет роутера, а значит сами. Абоненту же обещали все бесплатно! Абсолютно все. Он уверен в своей правоте и возможно он прав, но я то тут при чем? Такие заявки как правило не подключаются. А потому нужно сразу предупреждать абонента, если у него роутер свой, то настройка за его счет. Тогда он отказывается и кабель тянуть уже не нужно))). Да и вообще,я бы наверное не рекомендовал покупать свой роутер за большие деньги. Ибо сейчас как правило почти все провайдеры дают роутер в аренду по смешной цене, он точно подходит, его настройка бесплатна, а при смене провайдера, Вы не столкнетесь с тем, что ваш супер дорогой и навороченный роутер не подошел и теперь валяется бесполезным хламом. Но нужно помнить одну важную вещь, что при расторжении договора с провайдером, роутер и ТВ приставки нужно сдать в кратчайший срок ибо без договора об услугах связи, аренда оборудования становится золотой. Так же продаваны часто заводя заявку, бывают выписывают для интерактивного ТВ, только одну приставку, с фанатизмом вдалбливая абоненту, что ее одной хватит на все 5 телевизоров в доме. Это не так. Одна приставка-один телевизор. Плюс провод пойдет к этой приставке от роутера и убирать и прятать бесплатно я не стану.

Уф. что то устал писать. И так многа букв получилось. наверное продолжу потом, второй частью. Если есть вопросы то не стесняйтесь))) Пишите в комментах.

Илон Маск рекомендует:  rtrim - Удаляет пробелы из конца строки
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL