Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.6. Работа с реестром в kol

В отличие от VCL, где в модуле Registry.pas работа с реестром идет через объекты, в KOL основная функциональность для работы с реестром представлена рядом функций-переходников к соответствующим функциям API. (Если я не ошибаюсь, для KOL так же имеется адаптированный добровольцами TRegistry, но я пользуюсь своими функциями, и мне этого вполне хватает). Эти низкоуровневые функции, так же как и функции доступа к файлам, работают с дескриптором типа THandle, который фактически является беззнаковым числом.

Существенное отличие функций RegKeyXXXXX от работы напрямую с функциями API реестра Windows состоит в том, что неверное или ошибочное обращение к несуществующим или недоступным ключам реестра, даже в случае отсутствия проверок в программе на удачность обращения, приводит к холостому проскакиванию вызовов без каких-либо последствий. Т.е., в случае неудачного открытия ключа в качестве дескриптора возвращается 0, и последующие обращения к прочим функциям этой группы с таким дескриптором просто игнорируются (а при необходимости что-либо возвратить возвращаются значения по умолчанию, т.е. нули и пустые строки).

RegKeyOpenRead( k, s ) - открывает ключ реестра на чтение;

RegKeyOpenWrite( k, s ) - открывает ключ на запись;

RegKeyOpenCreate( k, s ) - создает ключ (если он не был еще создан) и открывает на запись;

RegKeyClose( r ) - закрывает открытый дескриптор;

RegKeyDelete( r, s ) - удаляет подключ с заданным именем;

RegKeyGetStr( r, s ) - возвращает значение строкового значения;

RegKeyGetStrEx( r, s ) - то же, что и предыдущая функция, но дополнительно понимает значения типа REG_EXPAND_SZ (т.е. системные переменные вроде %TEMP% замещаются своими значениями из переменных среды);

RegKeySetStr( r, s, s1 ) - записывает строковое значение;

RegKeySetStrEx( r, s, s1, e ) - то же, что и предыдущая функция, но позволяет записывать значения типа REG_EXPAND_SZ;

RegKeyGetDw( r, s ) - возвращает значение числового значения (или значения, которое может быть интерпретировано как числовое);

RegKeySetDw( r, s, i ) - записывает числовое значение;

RegKeyDeleteValue( r, s ) - удаляет значение;

RegKeyExists( r, s ) - проверяет наличие значения;

RegKeyValueSize( r, s ) - возвращает размер значения;

RegKeyGetBinary( r, s, buf, n ) - читает бинарное значение в буфер;

RegKeySetBinary( r, s, buf, n ) - записывает бинарное значение;

RegKeyGetDateTime( r, s ) - читает значение типа дата/время;

RegKeySetDateTime( r, s, d ) - записывает значение типа дата/время;

RegKeyGetValueTyp( r, s ) - возвращает тип значения;

RegKeyGetValueNames( r, list ) - перечисляет имена всех значений в указанном списке типа PStrList;

RegKeyGetSubKeys( r, list ) - перечисляет все подключи в указанном списке PStrList.

2.7. Служебные функции для работы с окнами в kol

Данный набор функций скорее расширяет API, чем просто является переходником, и может использоваться для самых разных целей (взаимодействие между окнами, в том числе между различными приложениями, выявление каких-либо характеристик операционной системы).

GetWindowChild( wnd, kind ) - позволяет получить дочернее окно данного окна, обладающее заданными характеристиками (владеющее фокусом ввода с клавиатуры, кареткой, захватившее в монопольное использование мышь или обладающее активизированным меню);

GetFocusedChild( wnd ) - подвид предыдущей функции, интересуется только окнами в фокусе ввода;

FindWindowByThreadID( t ) - отыскивает окно, принадлежащее заданному потоку исполнения инструкций;

Stroke2Window( wnd, s ) - отправляет строку в окно в фокусе ввода, как если бы эту строку напечатал пользователь на клавиатуре;

Stroke2WindowEx( wnd, s, wait ) - то же, что предыдущая функция, но позволяет "нажимать" в том числе на управляющие клавиши на клавиатуре, такие как стрелки, листание страниц и т.п.;

WindowsShutdown( s, force, reboot ) - останавливает сеанс / завершает работу / перезагружает компьютер;

WinVer - возвращает версию Windows (тип возвращаемого значения TWindowsVersion определяется как упорядоченный список констант wv31, wv95, wv98, vwME*, wvNT, wvY2K, wvXP, wvVista, wvWin7);

IsWinVer( wv ) - проверяет, является ли версия Windows одной из заданных множеством wv;

ExecuteWait( AppPath, CmdLine, DfltDirectory, Show,TimeOut, ProcID ) - запускает на исполнение и ожидает завершения (указанный период времени) указанное приложение;

ExecuteIORedirect( AppPath, CmdLine, DfltDirectory, Show, ProcID, InPipe, OutPipeWr, OutPipeRd ) - запускает консольное приложение, перенаправляя его ввод/вывод на указанные объекты типа pipe (труба, если дословно, разновидность файловых потоков в Windows);

ExecuteConsoleAppIORedirect( const AppPath, CmdLine, DfltDirectory, Show, InStr, OutStr, WaitTimeout ) - то же, что и предыдущая функция, но после запуска приложения на вход ей "подается" строка InStr, а по окончании на выходе читается содержимое ее консоли в строке OutStr;

GetDesktopRect - возвращает прямоугольник на экране, свободный для окон приложений (исключая, например, панель задач Windows, и другие панели на краях экрана);

GetWorkArea - то же, что и предыдущая функция, но результат получается несколько другим путем, через SystemParametersInfo. Для различных целей более корректно пользоваться либо этой функцией, либо предыдущей. Для Windows 7 функция GetDesktopRect всегда перенаправляется на функцию GetworkArea, например.

Пожалуй, в этот же раздел стоит добавить пару функций из KOL.pas, которые могут использоваться для контроля единственности запущенного экземпляра приложения (бывает такая необходимость, чтобы приложение не допускало многократного запуска себя пользователем):

JustOne( wnd, s ) - возвращает true, если только приложение запущено в единственном экземпляре (если в момент запуска приложения обнаружено, что такое уже имеется среди работающих, возвращается false);

JustOneNotify( wnd, s, onanother ) - аналогично предыдущему, но в дополнение устанавливает обработчик события OnAnotherInstance, который срабатывает в первом запущенном приложении, а когда запускается второе, то при срабатывании обработчик события получает в качестве параметра командную строку, с которой было запущен второй (и прочие) экземпляр(ы) приложения. Например, если при изготовлении текстового редактора в начале работы, когда главная форма еще невидимая, сделать вызов:

if not JustOneNotify( MainForm.Handle, 'My.Super.Puper.Text.Editor', OnAnotherMyEditor ) then

MainForm.Close;

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