« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
    Популярное
Диалоговые окна

Оптимизируем «тяжелые» JavaScript-вычисления

Функция AccessResource

Формирование числительных

Wireless Application Protocol

Некоторые аспекты использования пользовательских функций в предложениях SQL.

Резюме

Модели жизненного цикла ПО

Освоение Ajax, часть 2: Выполнение асинхронных запросов с JavaScript и Ajax

Состояние представления (вида)




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 169
Пользователей: 0

Статьи:: Delphi :: Разные статьи :: Способы сохранения и загрузки параметров программного обеспечения 



отправить ссылку другу версия для печати  Обсудить на форуме

Способы сохранения и загрузки параметров программного обеспечения 



Способы сохранения и загрузки параметров программного обеспечения

Способы сохранения и загрузки параметров программного обеспечения 

В этой статье речь пойдет о способах сохранения и загрузки параметров программного обеспечения. Из своего личного опыта я могу твердо сказать, что это не так просто, как кажется многим. Как Вы уже успели заметить, крупные программные продукты используют для хранения своих параметров исключительно системный реестр. Напротив, разработчики программного обеспечения, относящие его к Freeware, предпочитают  конфигурационные файлы с расширением “INI” (далее “ini-файлы”). Почему же дело обстоит именно так? Мы рассмотрим два этих способа более подробно, а так же поговорим о внедрении определенных средств защиты  ini-файлов.

        Системный реестр – один из самых надежных, но отнюдь не самый безопасный способов хранения параметров. Данные в нем располагаются в виде иерархической структуры, что облегчает поиск нужного раздела, но тем самым увеличивает риск удаления данных. Угрозой потери данных, находящихся в реестре, кроме неосторожных действий самих пользователей, могут являться сбои в операционной системе Microsoft Windows. Но это уже другая история.

          Для работы с системным реестром в Borland Delphi предусмотрен модуль Registry, который содержит класс TRegistry.

Uses Registry;

….

….

Var

  R: TRegistry;

Begin

  R := Tregistry.Create;

  …..

  …..

  …..

  R.Free;

End;

  Рассмотрим принципы сохранения и загрузки данных, используя системный реестр, на небольшом примере, который будет содержать две процедуры GetCaption и SaveCaption.

 

procedure GetCaption;

var

  R: TRegistry;

begin

  R := TRegistry.Create;

  R.RootKey := HKEY_LOCAL_MACHINE;

  {

    Открытие ключа. Параметр True означает,

    что при отсутствии ключа он автоматически создается

  }

  R.OpenKey('SoftwareTest', True)

  {Записываем параметр}

  R.WriteString('FormCaption', Form1.Caption);

  {Закрываем ключ}

  R.CloseKey;

  R.Free;

end;

 

procedure SaveCaption;

var

  R: TRegistry;

begin

  R := TRegistry.Create;

  R.RootKey := HKEY_LOCAL_MACHINE;

  R.OpenKey('SoftwareTest', True)

  {

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

    ранее сохраненную строчку

  }

  Form1.Caption := R.ReadString('FormCaption');

  R.CloseKey;

  R.Free;

end;

         Процедура SaveCaption сохраняет заголовок формы, а процедура GetCaption загружает из реестра ранее сохраненную строку, и устанавливает ее в качестве заголовка.

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

         Стоит сказать еще о двух процедурах модуля Registry: GetKeyNames и GetValueNames. Они позволяют сканировать реестр, как обычные каталоги. При открытии ключа вы указываете начальный путь поиска, а далее процедура GetKeyNames создает список типа TStrings и записывает в него имена всех найденных ключей, а процедура GetValueNames составляет список из имен параметров, находящихся в заданном ключе.

До появления 32-х разрядных операционных систем, для хранения параметров программы использовали исключительно конфигурационные файлы с расширением “INI” (далее ini-файлы). Но вскоре, ini-файлы были забыты, и на смену им пришел системный реестр. Но до сих пор встречаются программы, которые активно используют такой способ хранения параметров. В чем же его преимущества? Прежде всего в стабильности. В отличие от системного реестра, при сбоях в операционной системе с ini-файлом ничего не случается, если только он не находится в системном каталоге. Стоит помнить, что ini-файл должен находиться в одном каталоге с программой. Кроме стабильности, важным преимуществом ini-файлов является мобильность программного кода, в чем вы можете убедиться, посмотрев пример, приведенный ниже. Что же касается недостатков, то это простота удаления. Ini-файл – это обычный файл, который можно случайно удалить.

 Для работы с ini-файлами в Borland Delphi предусмотрен модуль IniFiles.

Uses IniFiles;

 

….

….

….

Var

  IniFile: TiniFile;

Begin

  IniFile := TiniFile.Create(‘имя файла’);

  ….

  ….

  ….

  IniFile.Free;

End;

          Принципы работы Ini-файлов и системного реестра схожи между собой. Изменим предыдущую программу, которая сохраняла и изменяла заголовок формы, используя системный реестр.

procedure SaveCaption;

var

  IniFile: TIniFile;

begin

  IniFile := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Test.ini');

  IniFile.WriteString('MainOptions', 'FormCaption', Form1.Caption);

  IniFile.Free;

end;

 

procedure GetCaption;

var

  IniFile: TIniFile;

begin

  IniFile := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Test.ini');

  Form1.Caption := IniFile.ReadString('MainOptions', 'FormCaption', '');

  IniFile.Free;

end;

          Как видите, по сравнению с предыдущей программой, наблюдается уменьшение программного кода. Да и ошибок при работе с ini-файлами возникает так же намного меньше, чем с системным реестром.

        А теперь, поговорим о средствах защиты. Операционная система предоставляет возможность закрытия доступа к определенным файлам. Но, к сожалению, закрытие доступа длится только во время работы программы. После того, как программа будет закрыта, доступ будет полностью открыт. Например, можно ограничить доступ к ini-файлу. Для реализации данной возможности, среди множества функций WinAPI существует функция OpenFile. Давайте попробуем написать программу, которая закрывала бы доступ к ini-файлу.

 var

  Form1: TForm1;

  hIniLockedFile: Cardinal;

  OfStruct      : _OfStruct;

 

implementation

 {$R *.dfm}

procedure SaveCaption;

var

  IniFile: TIniFile;

begin

  {Отключаем защиту файла}

  CloseHandle(hIniLockedFile);

  {Резервное время для оключения}

  Sleep(1000);

  IniFile := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Test.ini');

  IniFile.WriteString('MainOptions', 'FormCaption', Form1.Caption);

  IniFile.Free;

  {После сохранения, заново ставим защиту}

  hIniLockedFile := OpenFile(PChar(ExtractFileDir(Application.Exename) + 'Test.ini'), OfStruct, OF_Share_Exclusive);

end;

 

procedure GetCaption;

var

  IniFile: TIniFile;

begin

  IniFile := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Test.ini');

  Form1.Caption := IniFile.ReadString('MainOptions', 'FormCaption', '');

  IniFile.Free;

  {Устанавливаем защиту}

  hIniLockedFile := OpenFile(PChar(ExtractFileDir(Application.Exename) + 'Test.ini'), OfStruct, OF_Share_Exclusive);

end;

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

(Рис. 1) Ограничение доступа к файлу Test.ini

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

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

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

       Я написал две простейшие процедуры кодирования и декодирования текста. На их примере мы и рассмотрим работу нашей программы.

 var

  Form1: TForm1;

  hIniLockedFile: Cardinal;

  OfStruct      : _OfStruct;

 

const

  csCryptFirst = 20;

  csCryptSecond = 230;

  csCryptHeader = 'Crypted';

 

type

  ECryptError = class(Exception);

 

 

implementation

 

{$R *.dfm}

 

 

function CryptString(Str:String):String;

var

  I    : Integer;

  Clen : Integer;

begin

  clen := Length(csCryptHeader);

  SetLength(Result, Length(Str)+clen);

  Move(csCryptHeader[1], Result[1], clen);

  For i := 1 to Length(Str) do

   begin

    if i mod 2 = 0 then

     Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)

    else

     Result[i+clen] := Chr(Ord(Str[i]) xor csCryptSecond);

   end;

end;

 

function UnCryptString(Str:String):String;

var

  I    : Integer;

  Clen : Integer;

begin

  Clen := Length(csCryptHeader);

  SetLength(Result, Length(Str)-Clen);

  If Copy(Str, 1, clen) <> csCryptHeader then

   raise ECryptError.Create('Файл поврежден!');

  For i := 1 to Length(Str)-clen do

   begin

    if (i) mod 2 = 0 then

     Result[i] := Chr(Ord(Str[i+clen]) xor csCryptFirst)

    else

     Result[i] := Chr(Ord(Str[i+clen]) xor csCryptSecond);

   end;

end;

 

Procedure CryptIniFile;

var

  S: TStringList;

  I: Integer;

begin

  S := TStringList.Create;

  S.LoadFromFile(ExtractFileDir(Application.Exename) + 'Test.ini');

  For I := 0 to S.Count - 1 do

    S.Strings[I] := CryptString(S.Strings[I]);

  S.SaveToFile(ExtractFileDir(Application.Exename) + 'Test.ini');

end;

 

Procedure DecryptIniFile;

var

  S: TStringList;

  I: Integer;

begin

  if not FileExists(ExtractFileDir(Application.Exename) + 'Test.ini') then Exit;

  S := TStringList.Create;

  S.LoadFromFile(ExtractFileDir(Application.Exename) + 'Test.ini');

  For I := 0 to S.Count - 1 do

    S.Strings[I] := UnCryptString(S.Strings[I]);

  S.SaveToFile(ExtractFileDir(Application.Exename) + 'Test.ini');

end;

procedure SaveCaption;

var

  IniFile: TIniFile;

begin

  {Отключаем защиту файла}

  CloseHandle(hIniLockedFile);

  {Резервное время для оключения}

  Sleep(1000);

  IniFile := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Test.ini');

  IniFile.WriteString('MainOptions', 'FormCaption', Form1.Caption);

  IniFile.Free;

  {После сохранения, заново ставим защиту}

  hIniLockedFile := OpenFile(PChar(ExtractFileDir(Application.Exename) + 'Test.ini'), OfStruct, OF_Share_Exclusive);

end;

 

procedure GetCaption;

var

  IniFile: TIniFile;

begin

  {Расширофка конфигурационного файла}

  DeCryptInIFile;

  Sleep(1000);

  IniFile := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Test.ini');

  Form1.Caption := IniFile.ReadString('MainOptions', 'FormCaption', '');

  IniFile.Free;

  {Устанавливаем защиту}

  hIniLockedFile := OpenFile(PChar(ExtractFileDir(Application.Exename) + 'Test.ini'), OfStruct, OF_Share_Exclusive);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  GetCaption;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  SaveCaption;

  CloseHandle(hIniLockedFile);

  CryptInIFile;

end;

(Рис. 2) Файл «Test.ini» в зашифрованном виде

 

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

  Следует сказать пару слов о самих алгоритмах кодирования  и декодирования текста. В качестве признака того, что файл уже был закодирован, используется обыкновенная текстовая строка «Crypted», которой соответствует константа csCryptHeader. Она следует вначале каждой зашифрованной строчки. Перед шифрованием, определяется длина строки csCryptHeader, после чего увеличивается длина будущей строки, которая равна длине шифруемой строки и длине строки csCryptHeader. Далее, простым перебором, происходит замена каждого символа шифруемой строки. Это осуществляется с помощью функции Chr, которая по сгенерированному программой числу возвращает соответствующий символ. При замене символов, следует учитывать определенные параметры, которые определяет логическая операция. В нашем примере, в зависимости от того, делится ли порядковый номер строки на два без остатка, используются разные параметры, что усложняет последующую дешифровку текста.

  При дешифровки текста определяется его реальная длина, что достигается вычитанием из длины дешифруемой строки длины строки csCryptHeader. Для того, что бы определить, поврежден файл или нет, программа ищет в закодированной строчке заголовок, в нашем примере это «Crypted», и если он отсутствует, то дешифровка прекращается и возникает ошибка. Если же все в порядке, далее идет расшифровка текста, алгоритм которой полностью противоположен алгоритму шифрования.

  Итак, все способы, освещенные в статье, были подробно разобраны и оговорены. Теперь выбор за вами. Попробуйте описанные в этой статье способы на своей практике. Импровизируйте, пытаясь создать что-то совершенное, и решение в выборе между системным реестром и ini-файлами придет к вам.

 

                  Автор статьи: Корнейчук Михаил




Рубрика: Разные статьи




HTML 5: пять вещей вызывающих особый интер....

Html

HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.


Подробнее... | Рубрика: Html | Добавлено: 22.12.2008

asp.net: ListView с разных сторон.

.NET компоненты

Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.


Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

Создание кросс-таб отчета в Stimulsoft Rep....

.NET компоненты

Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.


Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

Остальные статьи:

VivaMP - инструмент для OpenMP
Создаем контекстно-зависимое WPF-приложени...
Windows Vista SP2: что внутри и что важно?
Вышел MySQL 5.1.30, первый стабильный рели...
Тестирование параллельных программ
Архитектура AMD64 (EM64T)
Платформа 2009. Определяя будущее
Windows Vista Bridge Sample Library - упра...
Оптимизация 64-битных программ
Подгрузка через AJAX HTML-кода, содержащег...
Обзор нового релиза самой мощной Ajax библ...
Firebug 1.3 и 1.4 alpha — что нового и инт...
Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия