LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 62. Материалы для начинающих (10 урок)

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         05.02.2007
Автор:     Парусников Алексей
Сайт:        http://www.accessoft.ru под редакцией с http://www.leadersoft.ru/
Новые материалы: регистрация
На сайте AccesSoft публикуются статьи, посвященные вопросам, связанным с разработкой и продвижением приложений Access. Вы так же можете ознакомиться с готовыми программами, получить исходный код, купить программу, связаться с автором для решения вопроса о доработке программы под Ваши требования.



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

Защита от несанкционированного копирования.

     Такая защита необходима, если Вы решите помешать кому либо сделать копию вашей программы. Это в первую очередь касается коммерческих разработок. Хотя в случае с Access приложениями это несколько спорный вопрос: а нужна ли кому то Ваша программа кроме Вас и иногда заказчику, для которого она делалась? Ведь даже в таких, казалось бы, стандартных приложениях типа «Складской учет» довольно часто приходится что то править под конкретного заказчика. В этом особенность распространения баз данных. Тем не менее, рассмотрим способ, затрудняющий копирование программы. Речь пойдет о регистрации.

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

  1. Разработчик свободно распространяет дистрибутив программы. При установке на компьютере и первом запуске программа опрашивает компьютер и формирует уникальную контрольную сумму, которая называется "Регистрационный номер". Затем программа осуществляет преобразование регистрационного номера в "регистрационный ключ".
  2. "Регистрационный номер" предъявляется пользователю, а в ответ пользователь должен ввести "регистрационный ключ", который программа сравнит со своим.
  3. Пользователь должен связаться с разработчиком и сообщить "регистрационный номер" программы.
  4. Разработчик должен (запустив спец.процедуру регистрации) сообщить пользователю "регистрационный ключ".
  5. Пользователь вводит "регистрационный ключ". Если он правильный, то программа запоминает его и при дальнейших запусках не опрашивает пользователя.

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

     В демо-режиме программу нужно в чем то ограничить. Для баз данных это обычно ограничение по количеству записей, или невозможность распечатки какого либо важного отчета. Реализуется это при помощи функции, которая запускается, например, при попытке распечатать отчет, и если программа не зарегистрирована, блокирует печать. То же и в случае с ограничением количества записей: если на событие формы «после обновления» повесить процедуру, проверяющую регистрацию и считающую максимальное количество записей в данной таблице (источник данных формы), то можно сделать условие – если записей больше чем можно, то свойству формы «Разрешить добавление» присвоить False.

     Form.AllowAdditions = False

     Подобное ограничение реализовано в примере. Итак, схема такая:

  1. Через макрос AutoExec запускаем функцию SetReferences (), которая в свою очередь запускает функцию isLicense, проверяющую регистрацию. Затем считывается номер винчестера, шифруется (fShifrDrv) и записывается в поле SystBase служебной таблицы tAdminCop.
  2. В этом же макросе после запуска функции следует запуск стартовой формы frmStart. А вот в ней, при событии «Открытие» происходит сравнение номера винчестера с тем, что хранится в таблице. Совпадают – хорошо, нет – выход из приложения. Подобную процедуру можно повесить и на другие «важные» формы.
  3. Если номер винчестера правильный, приложение открывается. Если isLicense=True, то полнофункциональный режим, иначе – демо.
  4. Для регистрации программы (переход в полнофункциональный режим) служит функция RegKluch. Она шифрует регистрационный номер, сформированный программой. У разработчика должен быть «генератор» - программа с аналогичной функцией. Пользователь присылает разработчику регистрационный номер, разработчик запускает генератор, вводит номер в поле «№ версии», ставит курсор в поле «Ключ» - и соответственно получает его (на событие «фокус в поле» стоит процедура RegKluch). Затем он отсылает ключ пользователю.
  5. Пользователь вводит ключ в поле формы регистрации, жмет «Зарегистрировать», и программа переходит в полноценную версию.

     В прилагаемом примере показана только привязка к номеру винчестера. Однако, если пользователь установит другой и запросит заново пройти регистрацию? А вдруг, он врет, и на самом деле его попросил знакомый, установивший Вашу программу и желающий «на халяву» ей воспользоваться? Поэтому, данная система регистрации не отрицает, а, наоборот, требует наличия всех остальных средств защиты: администрирование, шифрование и MDE-интерфейс. Если, например, при формировании регистрационного номера учитывается много констант (например, имя компьютера, имя пользователя, название процессора и т.д.), то можно регистрационный номер составлять из частей. Например, цифры 1 – 4  - это имя компьютера, 5 – 9 – это номер винчестера и т. д. Можно конечно и более хитро, тут полная свобода творчества. Теперь, если Вам скажут, что поменяли винчестер, проверьте, остались ли прежними имя компьютера, имя пользователя, версия BIOS и т. д. Если все изменилось – стало быть, Вас обманывают (а может и вправду, поменяли все «железо»). Но, как известно, железо не меняют каждую неделю, и единичным случаям можно и поверить.

     Теперь испытаем:

     Запускаем приложение. На стартовой форме появился регистрационный номер, стало быть, считали и зашифровали номер винчестера. Так же видно, что программа не зарегистрирована. Об этом сообщает надпись красного цвета. Жмем на кнопку «Открыть». На появившейся форме видим предупреждение о максимальном количестве записей – 10. Проверяем: вводим новые записи, и на десятой добавление закрывается.
Теперь попробуем зарегистрировать программу. Открываем приложение «Генератор». Копируем из поля «Рег. номер» в буфер значение и вставляем его в соответствующее поле формы – генератора. При переходе на поле «Ключ» получаем его значение. Копируем его в буфер.
Теперь на стартовой форме приложения жмем кнопку «Регистрация». В появившейся форме вставляем из буфера в поле значение ключа, жмем «Зарегистрировать». Все, программа готова к полноценной работе. Чтобы убедится в этом, пробуем ввести записей в табличную форму больше 10.

Как всегда, чтобы посмотреть, как все это работает, жмем на эту ссылку…


Ответы на вопросы
Вопрос 1. Подскажите пожалуста. В отчетах Access 2000 постоянно слетают настройки поля... становятся стандартными (24,4) и страницы становятся с альбомной на книжную... как быть ???

Ответ. Снять в Сервис - Параметры - Общие - Отслеживать автозамену имен флажок или установить серсис пак

Вопрос 2. Добрий день!
Помогите разобратсяЖ Есть форма (DEP_DOSROCHNO) в ней подчиненная (DEP_DOSROCHNO_1), на основной форме кнопка : код следующий:
[Forms]![DEP_DOSROCHNO_1]![KILKIST_DNIV] = DateDiff("d", [Forms]![DEP_DOSROCHNO_1]![DATA_DU], Now) Но подчененную форму не відет відает ошибку - "НЕ УДАЕТСЯ НАЙТИ ФОРМУ" - может из за того что подчиненная форма находится на вкладке ???

  Ответ. Forms![DEP_DOSROCHNO]![DEP_DOSROCHNO_1].Form![KILKIST_DNIV]
Вопрос 3. Добрый день, Admin!
В основной и в подчиненной форме имеются по кнопке. Эти кнопки выполняют одинаковые команды.
Возможно, команды этих кнопок записать в общем модуле? Как будет выглядеть ссылка на этот модуль?
  Ответ. Public Function - описывают не в классе формы, а во внешнем модуле.

Вопрос 4. Имеется класс для работы с деревом Treeview. Когда открывается одна форма с деревом - все работает нормально. Но когда открывается еще одна форма, в которой также есть дерево и которая использует тот же класс, то возникает ошибка: "Введенное выражение содержит недопустимую ссылку на свойство "|".(№2147024809)". В чем причина ошибки и как ее устранить? Спасибо.

  Ответ.Желательно деревья размещать в подчиненной форме.
Вопрос 5. Хочу сделать такую штуку: источник ПолеСоСписком1 - запрос, где есть ссылка на поле формы типа Forms!Форма!ПолеСоСписком2. Т. е выбираем в ПолеСоСписком2 значение, и делаем ПолеСоСписком2.Requery. Все это работает в простой форме. А вот в табличной и ленточной - источник данных списка меняется для всего столбца. А мне надо для каждого поля каждой записи. Единственное, что придумал - в ленточной форме делать два поля одно поверх другого и проявлять их на GotFocus и LostFocus. А может кто чего умнее знает?
  Ответ. 1. Должны быть специальная форма вверху таблицы (или всплывать), которая настраивается в зависимости от выбранного поля.
                2. Смарт-тег можно вставить.
Вопрос 6. Добрый день, Admin! c помощью этой команды можно открыть новый документ Word: Call Shell("winword", 1).
Но какая нужна команда для открытия существующего файла "Договор.doc"?
  Ответ. Application.FollowHyperlink "Договор.doc"