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

0

Тот, кто будет утверждать, что самостоятельно создавать инсталлятор нет никакого смысла — для этого есть множество разных программ, начиная с монструозной 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&id=15-988622372).

Теперь решим вопрос с формой представления программы. Хотя файла всего два, все равно удобно использовать самораспаковывающийся (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 в реестре по адресу:

HKEV_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Ruri. Причем

в 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: = ";

Reg := TRegistry.Create;

with Reg do

begin

Rootkey:=HKEY_LOCAL_MACHINE;

if Openkeyi’SOHTWARE\Microsoft\Windows\CurrentVersion\Run’,False) then try {системная переключалка клавиатуры}

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

st:=ReadString(‘ctfmon.exe’); except

CloseKey; {нет ни того, ни другого} Free; exit; end; end;

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

st:string;

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

Rootkey:=HKEY_CURRENT_USER;

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

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

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

Free;

exit;

end;

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),’Ошибка

деинсталляции’,mb OKCANCEL)oidOK

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

Forml.Hide;

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’,

nil,nil,SW_SHOWNQRMAL);

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

ShellExecute(Forml.Handle, ‘open1, ‘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’Run1,’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;

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

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

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

•nd; {убрали пункт Переключать раскладки клавиатуры}

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

Rootkey:=HKEY_LOCAL_MACHINE; if Openkey(

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

than

try

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

CloseKey; {подчистили) Free; and;

end; {внесли программу в автозапуск)

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

Rootkey:=HKEY_LOCAL_MACHINE; if Openkey(

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

begin

if CreateKey(‘Langswitch’) then begin

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

CloseKey; {подчистили I Free; end;

Endlnst; {диалог окончания) 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

end;

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

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

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

Forml.Close; end;

Тогда основная процедура по нажатию кнопки 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

DeleteKey(‘Langswitch’); CloseKey; {подчистили) end;

{возврат пункта Переключать раскладки клавиатуры:) st:=IniFile.ReadString(‘Layout*, ‘Hotkey’,”); if st<>’ ‘ then begin

with Reg do begin

Root key:=HKEY_CURRENT_USER;

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

WriteString(‘Layout Hotkey’,st); {восстановили} except end;

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

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

Reg := TRegistry.Create;

with Reg do

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.dil1)) 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),

‘Ошибка деинсталляции’,mb_OKCANCEL)oidOK then break else FlagDel:=True; end;

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));

end;

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

?      Langswitch.exe

?      LangHook.dll

?      LSlielp.htm

?      Setup.exe

?      Uninstall.exe

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

Title=nporpaMMa LangSwitch Text (

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

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

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

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

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

Ревич Ю.В. <revich@homepc.ru>

)

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 е.: ил.

По теме:

  • Комментарии