Организация удаленного доступа к распределенным базам данных
	
	
|   |календарного графика работы   |     |     |      |      |      | 
|3  |Подбор и изучение технической |12   |14   |16    |14    |0,44  | 
|   |документации и литературы     |     |     |      |      |      | 
|4  |Написание вводной части и     |3    |5    |7     |5     |0,44  | 
|   |литературного обзора          |     |     |      |      |      | 
|5  |Информационное моделирование  |26   |28   |29    |27,8  |0,25  | 
|   |системы                       |     |     |      |      |      | 
|6  |Разработка коммуникационного  |11   |12   |14    |12,2  |0,25  | 
|   |сервера                       |     |     |      |      |      | 
|1  |2                             |3    |4    |5     |6     |7     | 
|7  |Отладка коммуникационного     |16   |18   |20    |18    |0,44  | 
|   |сервера                       |     |     |      |      |      | 
|8  |Написание теоретической части |13   |15   |17    |15    |0,44  | 
|   |работы                        |     |     |      |      |      | 
|9  |Выводы по теоретической части |1    |2    |2     |1,8   |0,027 | 
|   |проекта                       |     |     |      |      |      | 
|10 |Подбор данных и расчет        |3    |4    |6     |4,2   |0,25  | 
|   |экономической части проекта   |     |     |      |      |      | 
|11 |Анализ проделанной работы     |1    |2    |2     |1,8   |0,27  | 
|12 |Составление пояснительной     |10   |12   |14    |12    |0,44  | 
|   |записки к дипломному проекту  |     |     |      |      |      | 
|13 |Оформление графической части  |11   |12   |13    |12    |0,44  | 
|   |работы                        |     |     |      |      |      | 
|14 |Оформление приложений к       |4    |5    |5     |4,8   |0,027 | 
|   |дипломному проекту            |     |     |      |      |      | 
|15 |Сдача работы на отзыв         |2    |2    |3     |2,2   |0,027 | 
|   |руководителю                  |     |     |      |      |      | 
|16 |Сдача работы на рецензирование|1    |2    |3     |2     |0,11  | 
|17 |Сдача дипломного проекта на   |1    |1    |1     |1     |0     | 
|   |кафедру                       |     |     |      |      |      | 
      Анализ  проведенных  расчетов  позволяет  сделать  вывод  о  том,  что 
расчетное  ожидаемое  время  выполнения  работы  приближается   к   наиболее 
вероятному времени и разброс временных параметров располагается в  интервале 
от 0 до 0,44. Это говорит о том, что при проведении работ необходимо  строго 
соблюдать временной режим. 
3.3 Построение ленточного графика выполнения работы 
      Одной  из  основных  целей  планирования  проведения  работы  является 
определение  их  общей  продолжительности.  Наиболее  удобным,   простым   и 
наглядным является ленточный график проведения работ. 
      Продолжительность каждой работы Tn определяется по формуле: 
      [pic] 
      где   Ti    - трудоемкость работ (чел./дн.) 
            Ci    - численность исполнителей (чел.) 
Таб.4.3. Ленточный график выполнения работ. 
|№  |Этап и содержание работы      |Трудоемкост|Численность|Длит-ть    | 
|n/n|                              |ь          |           |работы     | 
|   |                              |(чел./дн.) |(чел.)     |(дн.)      | 
|1  |2                             |3          |4          |5          | 
|1  |Постановка задачи и           |5          |3          |1,67       | 
|   |составление технического      |           |           |           | 
|   |задания                       |           |           |           | 
|2  |Составление плана и           |1          |2          |0,5        | 
|   |календарного графика работы   |           |           |           | 
|3  |Подбор и изучение технической |14         |2          |7          | 
|   |документации и литературы     |           |           |           | 
|4  |Написание вводной части и     |5          |1          |5          | 
|   |литературного обзора          |           |           |           | 
|5  |Информационное моделирование  |28         |2          |14         | 
|   |системы                       |           |           |           | 
|6  |Разработка коммуникационного  |12         |1          |12         | 
|   |сервера                       |           |           |           | 
|7  |Отладка коммуникационного     |18         |2          |9          | 
|   |сервера                       |           |           |           | 
|8  |Написание теоретической части |15         |2          |7,5        | 
|   |работы                        |           |           |           | 
|  9|Выводы по теоретической части |2          |2          |1          | 
|   |проекта                       |           |           |           | 
|10 |Подбор данных и расчет        |4          |2          |2          | 
|   |экономической части проекта   |           |           |           | 
|11 |Анализ проделанной работы     |2          |1          |2          | 
|12 |Составление пояснительной     |12         |1          |12         | 
|   |записки к дипломному проекту  |           |           |           | 
|13 |Оформление графической части  |12         |1          |12         | 
|   |работы                        |           |           |           | 
|1  |2                             |3          |4          |5          | 
|14 |Оформление приложений к       |5          |1          |5          | 
|   |дипломному проекту            |           |           |           | 
|15 |Сдача работы на отзыв         |2          |1          |2          | 
|   |руководителю                  |           |           |           | 
|16 |Сдача работы на рецензирование|2          |1          |2          | 
|17 |Сдача дипломного проекта на   |1          |1          |1          | 
|   |кафедру                       |           |           |           | 
|   |ИТОГО:                        |140        |           |94,67      | 
3.4 Определение плановой себестоимости НИР 
      Целью расчета себестоимости  НИР  является  экономически  обоснованной 
определение величины затрат  на  её  выполнение.  В  плановую  себестоимость 
включают  все  затраты,  связанные  с  выполнением  работы,  независимо   от 
источника финансирования. Определение затрат производится путем  составления 
затрат на НИР. 
      Смета затрат на НИР должна  быть  представлена  по  следующим  статьям 
калькуляции: 
     1. Материалы, покупные изделия и полуфабрикаты; 
     2. Спецоборудование для научных исследований; 
     3. Расходы на силовую электроэнергию. 
     4. Основная заработная плата производственного персонала; 
     5. Отчисления на социальное страхование; 
     6. Косвенные (накладные) расходы отдела(кафедры); 
     7. Производственные командировки; 
     8. Контрагентные работы, которые включают стоимость работ,  выполняемых 
        для темы другими организациями. 
     9. Оплата услуг опытного производства, находящегося на  самостоятельном 
        балансе; 
    10. Общеуниверситетские косвенные расходы; 
    11. Расходы на научно-техническую информацию; 
    12. Расходы на зарубежные лицензии и патенты; 
    13. Отчисления в пенсионный фонд; 
    14. Отчисления в фонд занятости; 
    15. Отчисления на медицинское страхование; 
    16. Затраты на эксплуатацию оборудования (амортизацию). 
1. Расчет стоимости покупных изделий представлен в таблице. 
Таб.4.3. Стоимость покупных изделий. 
|Изделие     |Количество |Цена за единицу,  |Сумма, руб| 
|            |           |руб               |          | 
|Дискета     |1          |5500              |5500      | 
|3.5’’       |           |                  |          | 
|Ватман      |5          |5000              |25000     | 
|Бумага      |1          |30000             |30000     | 
|ИТОГО:      |           |                  |60500     | 
2. Спецоборудование для работ не применялось, расходы отсутствуют. 
3. Работы  с использованием силовой электроэнергии не проводились, расходы 
  отсутствуют. 
4. В качестве базы для расчета заработной платы принимается месячный оклад 
  кандидата наук в размере 345000 руб. (13 разряд), что составляет в 
  пересчете на 1 учебный час работы при 800-часовой годовой нагрузке : 
            (345000 * 12) / 800 = 5175 (руб./час) 
      Руководство дипломным проектированием оценивается преподавателем в 6 
учебных часов. Таким образом, получим основную заработную плату 
производственного персонала в размере: 
5175 * 26  = 134550 (руб.) 
5. Отчисление на социальное  страхование.  По  условию  договора  составляют 
  5,4% от заработной платы (п.4). Сумма расходов по статье 7265 руб. 
6.   Косвенные   (накладные)   расходы   кафедры   условиями   договора   не 
  предусмотрены. 
7. Производственные командировки условиями договора не предусмотрены. 
8. Контрагентные работы не проводились, расходы отсутствуют. 
9. Оплата  услуг  опытного  производства,  находящегося  на  самостоятельном 
  балансе не проводилась. 
10. Общевузовские расходы. По условиям договора берутся  15%  от  заработной 
  платы (от п.4) и составляют 20183 руб. 
11. Расходы на научно-техническую информацию отсутствуют. 
12. Расходы на зарубежные лицензии и патенты отсутствуют. 
13. Отчисления в пенсионный фонд. Данные расходы берутся  в  размере  1%  от 
  основной заработной платы производственного персонала (п.4) и  составляют 
  1345 руб. 
14. Отчисления в фонд занятости. Расходы по данной  статье  2%  от  основной 
  заработной платы производственного персонала (п.4) или 2691 руб. 
15. Отчисления на медицинское страхование. На эти нужды отчисляется 3,6%  от 
  основной заработной платы производственного персонала (п.4) или 4844 руб. 
16. Затраты на эксплуатацию оборудования (амортизацию).  В  процессе  работы 
  над проектом использовались персональный компьютер IBM PC Pentium  133  и 
  принтер. Отчисления на амортизацию данной техники составляют 3200 руб. за 
  1 час работы и составляют при 300-часовой эксплуатации  компьютера  и  5- 
  часовой принтера 
        3200 * (300 + 5) = 976000 руб. 
Результаты калькуляции по статьям сведены в таблицу 
Таб.4.4. Калькуляция по статьям расходов. 
|Статья расходов                                              |Сумма, руб.| 
|Материалы, покупные изделия и полуфабрикаты                  |60500      | 
|Основная заработная плата производственного персонала        |134550     | 
|Отчисления на социальное страхование (5,4% от зарплаты)      |7265       | 
|Отчисления в фонд занятости (2% от зарплаты)                 |2691       | 
|Отчисления на медицинское страхование (3,6 % от зарплаты)    |4844       | 
|Налог на содержание МВД (1% от минимальной заработной платы) |835        | 
|Общеуниверситетские косвенные расходы (15% от зарплаты)      |20183      | 
|Отчисления в пенсионный фонд (1% от зарплаты)                |1345       | 
|Затраты на эксплуатацию оборудования (амортизацию)           |976000     | 
|ИТОГО:                                                       |1207213    | 
Заключение 
       За  время  работы  над  дипломным  проектом  по   теме   «Организация 
удаленного   доступа   к   распределенным   базам   данных»   были   изучены 
теоретические  основы  построения  распределенных  информационных  систем  с 
возможностью оперативного удаленного доступа к данным. 
      Результатом дипломного проектирования является информационная  система 
для автоматизации расчетов с абонентами АО «Связьинформ» РМ. В  ходе  работы 
было проведено информационное  моделирование  объекта,  построена  структура 
баз  данных,  отвечающая  предъявляемым  требованиям,  а  также  разработана 
архитектура   информационной   системы.   Кроме   того,   было   разработано 
программное обеспечение для автоматизации администрирования и решения  задач 
удаленного доступа, удаленного управления и репликации данных. 
      Отдельная глава посвящена технико-экономическому  обоснованию  данного 
дипломного проекта. 
Список литературы 
1. Borland InterBase Workgroup Server. API Guide. - Borland International 
  Inc, 1995 - 330 c. 
2. Borland InterBase Workgroup Server. DataDefinition Guide. - Borland 
  International Inc, 1995 - 212 c. 
3. Borland InterBase Workgroup Server. Language Reference. - Borland 
  International Inc, 1995 - 234 c. 
4. Borland InterBase Workgroup Server. Programmer’s Guide. - Borland 
  International Inc, 1995 - 340 c. 
5. Microsoft Online Documentation: Win32 Programmers Reference. 
6. R.Barker "CASE* Method - Entity Relationship Modelling". - Oracle Inc., 
  1990 - 243 c. 
7. Биллиг В.А., Мусикаев И.Х. «Visual C++ 4. Книга для программистов». - 
  М.: Издательский отдел «Русская редакция» ТОО «Channel Trading Ltd.» , 
  1996. - 352 с. ил. 
8. Галатенко В. «Информационная безопасность - обзор основных положений: 
  Ч1»: - Информационный бюллетень Jet Info №1/1996. 
9. Галатенко В. «Информационная безопасность - обзор основных положений: 
  Ч2»: - Информационный бюллетень Jet Info №2/1996. 
10. Галатенко В. «Информационная безопасность - обзор основных положений: 
  Ч3»: - Информационный бюллетень Jet Info №3/1996. 
11. Грабер Мартин. “Введение в SQL”. Пер. с англ. - М.: Издательство 
  “ЛОРИ”, 1996. - 375 с., ил. 
12. Зубанов Ф. «Windows NT - выбор «профи»». - М.: Издательский отдел 
  «Русская редакция» ТОО «Channel Trading Ltd.» , 1996. - 392 с. ил. 
13. Кастер Х. «Основы Windows NT и NTFS». Пер. с англ. - М: Издательский 
  отдел «Русская редакция» ТОО «Channel Trading Ltd.» , 1996. - 440 с. ил. 
14. Ладыженский Глеб. «СУБД - коротко о главном» : - Информационный 
  бюллетень Jet Info №3-5/1995. 
15. Ларин Л.С., Челдаева Л.А., Гуськова Н.Д."Технико-экономическое 
  обоснование дипломных проектов", Саранск, 1983, 100 с. 
16. «Решения Microsoft» - Вып. 4. - М: АООТ «Типография Новости», 1996. 124 
  с., ил. 
17. «Решения Microsoft» - Вып. 5. - М: АООТ «Типография Новости», 1997. 132 
  с., ил. 
18. Рихтер Дж.. «Windows для профессионалов (Программирование в Win32 API 
  для Windows 95 и Windows NT)». Пер. с англ. - М: Издательский отдел 
  «Русская редакция» ТОО «Channel Trading Ltd.» , 1995. - 720 с. ил. 
19. Паппас К., Мюррей У.. «Visual C++. Руководство для профессионалов»: 
  пер. с англ. - Спб.: BHV - Санкт-Петербург, 1996. - 912 с., ил. 
20. «Сетевые средства Windows NT»: Пер. с англ. - СПб.: BHV - Санкт- 
  Петербург, 1996 - 496 с., ил. 
21. Фролов А.В., Фролов Г.В. «Microsoft Visual C++  и MFC». - М: Диалог- 
  МИФИ, 1996 - 288 с., ил. 
22. Фролов А.В., Фролов Г.В. «Программирование для Windows NT: Ч2». - М: 
  Диалог-МИФИ, 1997 - 271 с., ил. 
23. Янг М. «Mastering Microsoft Visual C++». Пер. с англ.- К.: ВЕК+, М.: 
  ЭНТРОП, 1997. - 704 с., ил. 
Приложение 1 
SQL-скрипт для генерации базы данных 
CREATE GENERATOR genUslPropsKeys; 
CREATE GENERATOR genUslProps; 
CREATE GENERATOR genPhonesRegions; 
CREATE GENERATOR genPhonesStations; 
CREATE GENERATOR genPhonesStreets; 
CREATE GENERATOR genPhonesBanks; 
CREATE GENERATOR genTalksPay; 
CREATE GENERATOR genTalks; 
CREATE GENERATOR genNach; 
CREATE GENERATOR genNachBillings; 
CREATE GENERATOR genNachBillDates; 
CREATE GENERATOR genNachConstUsl; 
CREATE GENERATOR genUslDivisions; 
CREATE GENERATOR genUslLgots; 
CREATE GENERATOR genUslsKeys; 
CREATE GENERATOR genUsls; 
CREATE GENERATOR genUslCatKeys; 
CREATE GENERATOR genUslCat; 
CREATE GENERATOR genPhones; 
CREATE GENERATOR genPhonesOwnersKeys; 
CREATE GENERATOR genPhonesOwners; 
CREATE GENERATOR genSysSettings; 
CREATE GENERATOR genPhonesKeys; 
CREATE GENERATOR genPlat; 
CREATE GENERATOR genPhonesPostStations; 
CREATE GENERATOR genSysLog; 
CREATE GENERATOR genUslTypes; 
CREATE GENERATOR genUslDivisionsKeys; 
CREATE DOMAIN CALLTIME_TYPE INTEGER NOT NULL; 
CREATE DOMAIN CURR_TYPE FLOAT DEFAULT 0 NOT NULL; 
CREATE DOMAIN DATE_TYPE DATE NOT NULL; 
CREATE DOMAIN DESCR_TYPE CHAR(32); 
CREATE DOMAIN PHONE_TYPE CHAR(7) NOT NULL; 
CREATE DOMAIN PROCENT_TYPE FLOAT DEFAULT 100 NOT NULL 
                                   CHECK (VALUE BETWEEN 0 AND 300); 
CREATE TABLE Nach ( 
       Code                 INTEGER NOT NULL, 
       Owner                INTEGER NOT NULL, 
       Usl                  INTEGER NOT NULL, 
       Phone                INTEGER, 
       UslSum               CURR_TYPE, 
       NachDate             DATE_TYPE, 
       BillDate             DATE_TYPE 
); 
ALTER TABLE Nach 
       ADD CONSTRAINT XPKNach PRIMARY KEY (Code); 
CREATE TABLE NachBillDates ( 
       Code                 INTEGER NOT NULL, 
       BillingDate          INTEGER NOT NULL 
); 
ALTER TABLE NachBillDates 
       ADD CONSTRAINT XPKBillDates PRIMARY KEY (Code); 
CREATE TABLE NachBillings ( 
       Code                 INTEGER NOT NULL, 
       Division             INTEGER NOT NULL, 
       Owner                INTEGER NOT NULL, 
       BillDateCode         INTEGER NOT NULL 
); 
ALTER TABLE NachBillings 
       ADD CONSTRAINT XPKNachBillings PRIMARY KEY (Code); 
CREATE TABLE NachConstUsl ( 
       Code                 INTEGER NOT NULL, 
       Owner                INTEGER NOT NULL, 
       Usl                  INTEGER NOT NULL, 
       Phone                INTEGER NOT NULL, 
       UslSum               CURR_TYPE, 
       BegDate              DATE_TYPE, 
       EndDate              DATE_TYPE 
); 
ALTER TABLE NachConstUsl 
       ADD CONSTRAINT XPKNachConstUsl PRIMARY KEY (Code); 
CREATE TABLE Phones ( 
       Code                 INTEGER NOT NULL, 
       Street               INTEGER NOT NULL, 
       Owner                INTEGER NOT NULL, 
       PKey                 INTEGER NOT NULL, 
       Comment              DESCR_TYPE, 
       PhoneNmb             PHONE_TYPE, 
       InstallDate          DATE_TYPE, 
       RemoveDate           DATE_TYPE, 
       BegDate              DATE_TYPE, 
       EndDate              DATE_TYPE 
); 
ALTER TABLE Phones 
       ADD CONSTRAINT XPKPhones PRIMARY KEY (Code); 
CREATE TRIGGER Phones_BUH FOR Phones 
BEFORE UPDATE  POSITION 0 
AS 
BEGIN 
 /*     Изменение BegDate    */ 
 IF (new.BegDate <> old.BegDate) THEN 
   BEGIN 
     IF (new.BegDate < old.BegDate) THEN 
       BEGIN 
         /*     Расширение BegDate    */ 
         UPDATE Phones 
          SET EndDate = new.BegDate 
          WHERE ((new.BegDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение BegDate     */ 
         UPDATE Phones 
          SET EndDate = new.BegDate 
          WHERE ((EndDate = old.BegDate)  AND (PKey = new.PKey)); 
       END 
   END 
 /*     Изменение EndDate    */ 
 IF (new.EndDate <> old.EndDate) THEN 
   BEGIN 
     IF (new.EndDate > old.EndDate) THEN 
       BEGIN 
         /*     Расширение EndDate    */ 
          UPDATE Phones 
          SET BegDate = new.EndDate 
          WHERE ((new.EndDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение EndDate     */ 
          UPDATE Phones 
          SET BegDate = new.EndDate 
          WHERE ((BegDate = old.EndDate)  AND (PKey = new.PKey)); 
       END 
   END 
    /*     Сборка мусора       */ 
    DELETE FROM Phones 
    WHERE ((BegDate >= new.BegDate) AND (EndDate  new.Code)); 
END ^ 
CREATE TRIGGER Phones_BIH FOR Phones 
BEFORE INSERT POSITION 0 
AS 
BEGIN 
  DELETE FROM Phones 
  WHERE ((BegDate >= new.BegDate) AND (EndDate  old.BegDate) THEN 
   BEGIN 
     IF (new.BegDate < old.BegDate) THEN 
       BEGIN 
         /*     Расширение BegDate    */ 
         UPDATE PhonesOwners 
          SET EndDate = new.BegDate 
          WHERE ((new.BegDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение BegDate     */ 
         UPDATE PhonesOwners 
          SET EndDate = new.BegDate 
          WHERE ((EndDate = old.BegDate)  AND (PKey = new.PKey)); 
       END 
   END 
 /*     Изменение EndDate    */ 
 IF (new.EndDate <> old.EndDate) THEN 
   BEGIN 
     IF (new.EndDate > old.EndDate) THEN 
       BEGIN 
         /*     Расширение EndDate    */ 
          UPDATE PhonesOwners 
          SET BegDate = new.EndDate 
          WHERE ((new.EndDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение EndDate     */ 
          UPDATE PhonesOwners 
          SET BegDate = new.EndDate 
          WHERE ((BegDate = old.EndDate)  AND (PKey = new.PKey)); 
       END 
   END 
    /*     Сборка мусора       */ 
    DELETE FROM PhonesOwners 
    WHERE ((BegDate >= new.BegDate) AND (EndDate  new.Code)); 
END ^ 
CREATE TRIGGER PhonesOwners_BIH FOR PhonesOwners 
BEFORE INSERT POSITION 0 
AS 
BEGIN 
  DELETE FROM PhonesOwners 
  WHERE ((BegDate >= new.BegDate) AND (EndDate  old.BegDate) THEN 
   BEGIN 
     IF (new.BegDate < old.BegDate) THEN 
       BEGIN 
         /*     Расширение BegDate    */ 
         UPDATE UslCat 
          SET EndDate = new.BegDate 
          WHERE ((new.BegDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение BegDate     */ 
         UPDATE UslCat 
          SET EndDate = new.BegDate 
          WHERE ((EndDate = old.BegDate)  AND (PKey = new.PKey)); 
       END 
   END 
 /*     Изменение EndDate    */ 
 IF (new.EndDate <> old.EndDate) THEN 
   BEGIN 
     IF (new.EndDate > old.EndDate) THEN 
       BEGIN 
         /*     Расширение EndDate    */ 
          UPDATE UslCat 
          SET BegDate = new.EndDate 
          WHERE ((new.EndDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение EndDate     */ 
          UPDATE UslCat 
          SET BegDate = new.EndDate 
          WHERE ((BegDate = old.EndDate)  AND (PKey = new.PKey)); 
       END 
   END 
    /*     Сборка мусора       */ 
    DELETE FROM UslCat 
    WHERE ((BegDate >= new.BegDate) AND (EndDate  new.Code)); 
END ^ 
CREATE TRIGGER UslCat_BIH FOR UslCat 
BEFORE INSERT POSITION 0 
AS 
BEGIN 
  DELETE FROM UslCat 
  WHERE ((BegDate >= new.BegDate) AND (EndDate  old.BegDate) THEN 
   BEGIN 
     IF (new.BegDate < old.BegDate) THEN 
       BEGIN 
         /*     Расширение BegDate    */ 
         UPDATE UslDivisions 
          SET EndDate = new.BegDate 
          WHERE ((new.BegDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение BegDate     */ 
         UPDATE UslDivisions 
          SET EndDate = new.BegDate 
          WHERE ((EndDate = old.BegDate)  AND (PKey = new.PKey)); 
       END 
   END 
 /*     Изменение EndDate    */ 
 IF (new.EndDate <> old.EndDate) THEN 
   BEGIN 
     IF (new.EndDate > old.EndDate) THEN 
       BEGIN 
         /*     Расширение EndDate    */ 
          UPDATE UslDivisions 
          SET BegDate = new.EndDate 
          WHERE ((new.EndDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение EndDate     */ 
          UPDATE UslDivisions 
          SET BegDate = new.EndDate 
          WHERE ((BegDate = old.EndDate)  AND (PKey = new.PKey)); 
       END 
   END 
    /*     Сборка мусора       */ 
    DELETE FROM UslDivisions 
    WHERE ((BegDate >= new.BegDate) AND (EndDate  new.Code)); 
END ^ 
CREATE TRIGGER UslDivisions_BIH FOR UslDivisions 
BEFORE INSERT POSITION 0 
AS 
BEGIN 
  DELETE FROM UslDivisions 
  WHERE ((BegDate >= new.BegDate) AND (EndDate  old.BegDate) THEN 
   BEGIN 
     IF (new.BegDate < old.BegDate) THEN 
       BEGIN 
         /*     Расширение BegDate    */ 
         UPDATE UslProps 
          SET EndDate = new.BegDate 
          WHERE ((new.BegDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение BegDate     */ 
         UPDATE UslProps 
          SET EndDate = new.BegDate 
          WHERE ((EndDate = old.BegDate)  AND (PKey = new.PKey)); 
       END 
   END 
 /*     Изменение EndDate    */ 
 IF (new.EndDate <> old.EndDate) THEN 
   BEGIN 
     IF (new.EndDate > old.EndDate) THEN 
       BEGIN 
         /*     Расширение EndDate    */ 
          UPDATE UslProps 
          SET BegDate = new.EndDate 
          WHERE ((new.EndDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение EndDate     */ 
          UPDATE UslProps 
          SET BegDate = new.EndDate 
          WHERE ((BegDate = old.EndDate)  AND (PKey = new.PKey)); 
       END 
   END 
    /*     Сборка мусора       */ 
    DELETE FROM UslProps 
    WHERE ((BegDate >= new.BegDate) AND (EndDate  new.Code)); 
END ^ 
CREATE TRIGGER UslProps_BIH FOR UslProps 
BEFORE INSERT POSITION 0 
AS 
BEGIN 
  DELETE FROM UslProps 
  WHERE ((BegDate >= new.BegDate) AND (EndDate  old.BegDate) THEN 
   BEGIN 
     IF (new.BegDate < old.BegDate) THEN 
       BEGIN 
         /*     Расширение BegDate    */ 
         UPDATE Usls 
          SET EndDate = new.BegDate 
          WHERE ((new.BegDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение BegDate     */ 
         UPDATE Usls 
          SET EndDate = new.BegDate 
          WHERE ((EndDate = old.BegDate)  AND (PKey = new.PKey)); 
       END 
   END 
 /*     Изменение EndDate    */ 
 IF (new.EndDate <> old.EndDate) THEN 
   BEGIN 
     IF (new.EndDate > old.EndDate) THEN 
       BEGIN 
         /*     Расширение EndDate    */ 
          UPDATE Usls 
          SET BegDate = new.EndDate 
          WHERE ((new.EndDate BETWEEN BegDate AND EndDate)  AND (PKey = 
new.PKey)); 
       END 
     ELSE 
       BEGIN 
         /*     Сужение EndDate     */ 
          UPDATE Usls 
          SET BegDate = new.EndDate 
          WHERE ((BegDate = old.EndDate)  AND (PKey = new.PKey)); 
       END 
   END 
    /*     Сборка мусора       */ 
    DELETE FROM Usls 
    WHERE ((BegDate >= new.BegDate) AND (EndDate  new.Code)); 
END ^ 
CREATE TRIGGER Usls_BIH FOR Usls 
BEFORE INSERT POSITION 0 
AS 
BEGIN 
  DELETE FROM Usls 
  WHERE ((BegDate >= new.BegDate) AND (EndDate  
#include "DoService.h" 
#include "CommonConfig.h" 
/* Globals */ 
SERVICE_STATUS          ServiceStatus; 
SERVICE_STATUS_HANDLE   ServiceStatusHandle; 
/* Function Prototypes */ 
void WINAPI ServiceStart (DWORD   argc, LPTSTR  *argv); 
VOID WINAPI ServiceCtrlHandler (IN  DWORD opcode); 
DWORD ServiceInitialization(DWORD argc, LPTSTR  *argv, 
        DWORD  *specificError); 
VOID _CRTAPI1 main(int argc, char **argv) 
{ 
      int i; 
    SERVICE_TABLE_ENTRY   DispatchTable[] = { 
            { TEXT("SiTime"), ServiceStart }, 
        { NULL,              NULL           } 
    }; 
    /* Allow the user to override settings with command line switches */ 
    for ( i = 1; i < argc; i++) { 
        if ((*argv[i] == '-') || (*argv[i] == '/')) { 
               switch (tolower(*(argv[i]+1))) { 
                case 'p':  // protocol sequence 
                    pszProtocolSequence = argv[++i]; 
                    break; 
                case 'e':  // endpoint 
                    pszEndpoint = argv[++i]; 
                    break; 
                default: ; 
             } 
         } 
      } 
    if (!StartServiceCtrlDispatcher( DispatchTable)) { 
            /* Error Handling */ 
    } 
} 
void WINAPI ServiceStart(DWORD   argc, LPTSTR  *argv) 
{ 
    DWORD   status; 
    DWORD   specificError; 
    ServiceStatus.dwServiceType        = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | 
        SERVICE_ACCEPT_PAUSE_CONTINUE; 
    ServiceStatus.dwWin32ExitCode      = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0; 
    ServiceStatusHandle = RegisterServiceCtrlHandler( 
                            TEXT("SiTime"), 
                            ServiceCtrlHandler); 
    if (ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { 
            /*  Error Handling */ 
        return; 
    } 
    // Initialization code goes here. 
    status = ServiceInitialization(argc,argv, &specificError); 
    // Handle error condition 
    if (status != NO_ERROR) { 
        ServiceStatus.dwCurrentState       = SERVICE_STOPPED; 
        ServiceStatus.dwCheckPoint         = 0; 
        ServiceStatus.dwWaitHint           = 0; 
        ServiceStatus.dwWin32ExitCode      = status; 
        ServiceStatus.dwServiceSpecificExitCode = specificError; 
        SetServiceStatus (ServiceStatusHandle, &ServiceStatus); 
        return; 
    } 
    // Initialization complete - report running status 
    ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0; 
    if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) { 
        status = GetLastError(); 
    } 
    // This is where the service does its work.     // 
    ServerProcess(); 
    return; 
} 
/* stub initialization function */ 
DWORD ServiceInitialization(DWORD   argc, LPTSTR  *argv, 
        DWORD *specificError) 
{ 
    *specificError = ServerInit(); 
      if (*specificError) return *specificError; 
  return(0); 
} 
void WINAPI ServiceCtrlHandler ( IN  DWORD   Opcode) 
{ 
    DWORD   status; 
    switch(Opcode) { 
    case SERVICE_CONTROL_PAUSE: 
        /* Do whatever it takes to pause here.  */ 
            ServerDoPause(); 
        ServiceStatus.dwCurrentState = SERVICE_PAUSED; 
        break; 
    case SERVICE_CONTROL_CONTINUE: 
        /* Do whatever it takes to continue here.*/ 
            ServerDoContinue(); 
        ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
        break; 
    case SERVICE_CONTROL_STOP: 
        /* Do whatever it takes to stop here.  */ 
            ServerDoStop(); 
        ServiceStatus.dwWin32ExitCode = 0; 
        ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
        ServiceStatus.dwCheckPoint    = 0; 
        ServiceStatus.dwWaitHint      = 0; 
        if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) 
        { 
            status = GetLastError(); 
        } 
        return; 
    case SERVICE_CONTROL_INTERROGATE: 
        /* fall through to send current status */ 
        break; 
    default: 
            /* Error handling */ 
            break; 
    } 
    /* Send current status.*/ 
    if (!SetServiceStatus (ServiceStatusHandle,  &ServiceStatus)) { 
        status = GetLastError(); 
    } 
    return; 
} 
CommonConfig.c 
Файл CommonConfig.c - Управление конфигурацией 
#include  
#include "CommonConfig.h" 
#include "EventLog.h" 
#define REGVALUENAME_LENGTH 255 
DWORD ConfigWatchingThread; 
HANDLE hConfigMutex    = NULL; 
HANDLE hTaskMutex      = NULL; 
unsigned char * pszProtocolSequence = "ncacn_np"; 
unsigned char * pszSecurity         = NULL; 
unsigned char * pszEndpoint         = "\\pipe\\CommServ"; 
unsigned int    cMinCalls           = 1; 
unsigned int    cMaxCalls           = 20; 
unsigned int    fDontWait           = FALSE; 
struct      TASKENTRY TaskTable[TASK_COUNT]; 
int         EntryCount = 0; 
DWORD TaskThreads[TASK_COUNT]; 
int         TaskCount = 0; 
void UpdateVariables() 
{ 
      HKEY  hKey; 
      DWORD dwIndex = 0; 
      DWORD VNameLength = REGVALUENAME_LENGTH; 
      char  VName[REGVALUENAME_LENGTH]; 
      DWORD dwLength = sizeof(struct TASKENTRY); 
      int        i; 
      __try { 
            WaitForSingleObject(hConfigMutex, INFINITE); 
            // Инициализация таблицы задач 
            for (i = 0; i < TASK_COUNT; i++) { 
                 TaskTable[i].Active         = FALSE; 
                 TaskTable[i].ExecTime  = 0; 
                 ZeroMemory(&TaskTable[i].DllName, 
sizeof(TaskTable[i].DllName)); 
                 TaskTable[i].TermProc  = NULL; 
                 TaskTable[i].TaskThread     = 0; 
            } 
            // Загрузка таблицы задач из реестра 
            if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
                  REGISTRY_TASKS_PATH, 
                  0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) { 
                 dwIndex          = 0; 
                 EntryCount  = 0; 
                 while (RegEnumValue(hKey, 
                                             dwIndex, 
                                             (char *)&VName, 
                                             &VNameLength, 
                                             NULL, 
                                             NULL, 
                                             (LPVOID)&TaskTable[dwIndex], 
                                             &dwLength) == ERROR_SUCCESS) { 
                       if (dwLength != sizeof(struct TASKENTRY)) { 
                             LogEvent(EVENTLOG_ERROR_TYPE, "Invalid Task 
Parameter"); 
                             break; 
                       } 
                       EntryCount+=1; 
                       dwIndex+=1; 
                 } 
                 RegCloseKey(hKey); 
            } else LogEvent(EVENTLOG_ERROR_TYPE, "Error Loading 
Configuration"); 
      } 
      __finally { 
            ReleaseMutex(hConfigMutex); 
      } 
} 
DoService.c 
#include  
#include "DoService.h" 
#include "..\Comm.h" 
#include "CommonConfig.h" 
#include "ClientHandler.h" 
#include "EventLog.h" 
#include "ShedulerServ.h" 
void ServerProcess() { 
      hConfigMutex = CreateMutex(NULL, FALSE, NULL); 
      hTaskMutex  = CreateMutex(NULL, FALSE, NULL); 
      CreateThread(NULL, 0, ShedulingProc, NULL, 0, &ShedulingThread); 
    CreateThread(NULL, 0, RPCClientHandling, NULL, 0, 
&ClientHandlingThread); 
} 
DWORD ServerInit() { 
      RPC_STATUS status; 
    status = RpcServerUseProtseqEp( 
                          pszProtocolSequence, 
                          cMaxCalls, 
                          pszEndpoint, 
                          pszSecurity);  // Security descriptor 
      if (status != NO_ERROR) { 
            return(1); 
      } 
      status = RpcServerRegisterIf( 
                        CommService_ServerIfHandle, // !!! 
                        NULL,   // MgrTypeUuid 
                        NULL);  // MgrEpv; null means use default 
      if (status != NO_ERROR) { 
            return(2); 
      } 
      LogEvent(EVENTLOG_INFORMATION_TYPE, "\"Svyazinform\" Communicatin 
Service Initialized"); 
      return(0); 
} 
void ServerDoPause() 
{ 
      SuspendThread(&ShedulingThread); 
      SuspendThread(&ClientHandlingThread); 
      LogEvent(EVENTLOG_INFORMATION_TYPE, "\"Svyazinform\" Communicatin 
Service Paused"); 
} 
void ServerDoContinue() 
{ 
      ResumeThread(&ShedulingThread); 
      ResumeThread(&ClientHandlingThread); 
      LogEvent(EVENTLOG_INFORMATION_TYPE, "\"Svyazinform\" Communicatin 
Service Resumed"); 
} 
void ServerDoStop() { 
      RPC_STATUS status; 
    status = RpcMgmtStopServerListening(NULL); 
      if (status != NO_ERROR) { 
            // Error handling 
      } 
    status = RpcServerUnregisterIf(NULL, NULL, FALSE); 
      if (status != NO_ERROR) { 
            // Error handling 
      } 
      TerminateTasks(); 
      WaitForSingleObject(&ClientHandlingThread, 5000); 
      CloseHandle(&ClientHandlingThread); 
      InterlockedIncrement(&TerminateSheduling); 
      WaitForSingleObject(&ShedulingThread, 5000); 
      CloseHandle(&ShedulingThread); 
      WaitForSingleObject(hConfigMutex, 3000); 
      ReleaseMutex(hConfigMutex); 
      CloseHandle(hConfigMutex); 
      WaitForSingleObject(hTaskMutex, 3000); 
      ReleaseMutex(hTaskMutex); 
      CloseHandle(hTaskMutex); 
      LogEvent(EVENTLOG_INFORMATION_TYPE, "\"Svyazinform\" Communicatin 
Service Stopped"); 
} 
/**************************************************************/ 
/*                 MIDL allocate and free                     */ 
/**************************************************************/ 
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len) 
{ 
    return(malloc(len)); 
} 
void __RPC_USER midl_user_free(void __RPC_FAR * ptr) 
{ 
    free(ptr); 
} 
ClientHandler.c 
/**********************************************************/ 
/*     Этот модуль обрабатывает подключения клиентов      */ 
/**********************************************************/ 
#include  
#include "ClientHandler.h" 
#include "CommonConfig.h" 
#include "../Comm.h" 
DWORD ClientHandlingThread; 
DWORD WINAPI RPCClientHandling(LPVOID ThreadParm) 
{ 
      RPC_STATUS status; 
      status = RpcServerListen( 
                      cMinCalls, 
                      cMaxCalls, 
                      fDontWait); 
      if (status != NO_ERROR) { 
            return 1; 
      } 
      return 0; 
} 
void RefreshIniProps() 
{ 
      MessageBeep(1); 
      return; 
} 
EventLog.c 
#include  
#include "EventLog.h" 
void LogEvent(WORD EventType, LPSTR EventMsg) 
{ 
      HANDLE h; 
      h = RegisterEventSource(NULL, /* uses local computer         */ 
            "CommServ");              /* source name                 */ 
      if (h != NULL) 
      { 
            ReportEvent(h,            /* event log handle            */ 
                EventType,                /* event type                  */ 
                 0,                    /* category zero               */ 
                 0x1003,               /* event identifier            */ 
                 NULL,                 /* no user security identifier */ 
                 1,                    /* one substitution string     */ 
                 0,                    /* no data                     */ 
                 &EventMsg,               /* address of string array     */ 
                 NULL);                /* address of data             */ 
            DeregisterEventSource(h); 
      } 
      return; 
} 
Comm_s.c 
/* this ALWAYS GENERATED file contains the RPC server stubs */ 
/* File created by MIDL compiler version 3.00.15 */ 
/* at Tue Jun 03 11:35:46 1997 
 */ 
/* Compiler settings for comm.idl: 
    Os, W1, Zp8, env=Win32, ms_ext, c_ext, oldnames 
    error checks: none 
*/ 
//@@MIDL_FILE_HEADING(  ) 
#include  
#include "comm.h" 
#define TYPE_FORMAT_STRING_SIZE   1 
#define PROC_FORMAT_STRING_SIZE   3 
typedef struct _MIDL_TYPE_FORMAT_STRING 
    { 
    short          Pad; 
    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ]; 
    } MIDL_TYPE_FORMAT_STRING; 
typedef struct _MIDL_PROC_FORMAT_STRING 
    { 
    short          Pad; 
    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ]; 
    } MIDL_PROC_FORMAT_STRING; 
extern const MIDL_TYPE_FORMAT_STRING __MIDLTypeFormatString; 
extern const MIDL_PROC_FORMAT_STRING __MIDLProcFormatString; 
/* Standard interface: CommService, ver. 1.0, 
GUID={0x4a25d2e0,0x6703,0x11d0,{0x89,0x27,0x00,0xa0,0x24,0x13,0x85,0x0e}} 
*/ 
extern RPC_DISPATCH_TABLE CommService_DispatchTable; 
static const RPC_SERVER_INTERFACE CommService___RpcServerInterface = 
    { 
    sizeof(RPC_SERVER_INTERFACE), 
{{0x4a25d2e0,0x6703,0x11d0,{0x89,0x27,0x00,0xa0,0x24,0x13,0x85,0x0e}},{1,0}} 
, 
{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}} 
, 
    &CommService_DispatchTable, 
    0, 
    0, 
    0, 
    0, 
    0 
    }; 
RPC_IF_HANDLE CommService_ServerIfHandle = (RPC_IF_HANDLE)& 
CommService___RpcServerInterface; 
extern const MIDL_STUB_DESC CommService_StubDesc; 
void __RPC_STUB 
CommService_RefreshIniProps( 
    PRPC_MESSAGE _pRpcMessage ) 
{ 
    MIDL_STUB_MESSAGE _StubMsg; 
    RPC_STATUS _Status; 
    ((void)(_Status)); 
    NdrServerInitializeNew( 
                          _pRpcMessage, 
                          &_StubMsg, 
                          &CommService_StubDesc); 
    RpcTryFinally 
        { 
        RefreshIniProps(); 
        } 
    RpcFinally 
        { 
        } 
    RpcEndFinally 
    _pRpcMessage->BufferLength = 
        (unsigned int)((long)_StubMsg.Buffer - (long)_pRpcMessage->Buffer); 
} 
static const MIDL_STUB_DESC CommService_StubDesc = 
    { 
    (void __RPC_FAR *)& CommService___RpcServerInterface, 
    MIDL_user_allocate, 
    MIDL_user_free, 
    0, 
    0, 
    0, 
    0, 
    0, 
    __MIDLTypeFormatString.Format, 
    0, /* -error bounds_check flag */ 
    0x10001, /* Ndr library version */ 
    0, 
    0x300000f, /* MIDL Version 3.0.15 */ 
    0, 
    0, 
    0,  /* Reserved1 */ 
    0,  /* Reserved2 */ 
    0,  /* Reserved3 */ 
    0,  /* Reserved4 */ 
    0   /* Reserved5 */ 
    }; 
static RPC_DISPATCH_FUNCTION CommService_table[] = 
    { 
    CommService_RefreshIniProps, 
    0 
    }; 
RPC_DISPATCH_TABLE CommService_DispatchTable = 
    { 
    1, 
    CommService_table 
    }; 
#if !defined(__RPC_WIN32__) 
#error  Invalid build platform for this stub. 
#endif 
static const MIDL_PROC_FORMAT_STRING __MIDLProcFormatString = 
    { 
        0, 
        { 
                 0x5b,       /* FC_END */ 
                 0x5c,       /* FC_PAD */ 
                 0x0 
        } 
    }; 
static const MIDL_TYPE_FORMAT_STRING __MIDLTypeFormatString = 
    { 
        0, 
        { 
                 0x0 
        } 
    }; 
ShedulerServ.c 
/**********************************************************//*     Task 
Sheduler 
/**********************************************************/ 
#include  
#include "ShedulerServ.h" 
#include "CommonConfig.h" 
#include "EventLog.h" 
#define SLEEP_INTERVAL 5000 
#define ACTIVATE_INTERVAL 60000 
BOOL  TerminateSheduling = FALSE; 
DWORD ShedulingThread; 
DWORD WINAPI TaskProc(LPVOID ThreadParm); 
void  AnalyseTaskTable(); 
DWORD GetTimeInMins(); 
DWORD WINAPI ShedulingProc(LPVOID ThreadParm) 
{ 
      long i = 0; 
      while (!TerminateSheduling) { 
            if ((i += SLEEP_INTERVAL) >= ACTIVATE_INTERVAL) { 
                 i = 0; 
                 if (TaskCount == 0)    UpdateVariables(); 
                 AnalyseTaskTable(); 
            } 
            Sleep(SLEEP_INTERVAL); 
      } 
      return 0; 
} 
DWORD WINAPI TaskProc(LPVOID ThreadParm) 
{ 
      HINSTANCE  hLib; 
      FARPROC          hProc; 
      InterlockedIncrement(&TaskCount); 
      WaitForSingleObject(hConfigMutex, INFINITE); 
      MessageBeep(1); 
      if (hLib = LoadLibrary((char *)&((struct TASKENTRY*)ThreadParm)- 
>DllName)) { 
            if (((struct TASKENTRY*)ThreadParm)->TermProc = 
GetProcAddress(hLib, (LPCSTR)TaskProcName)) 
            { 
                 ((struct TASKENTRY*)ThreadParm)->Active = TRUE; 
                 ReleaseMutex(hConfigMutex); 
                 if (hProc = GetProcAddress(hLib, (LPCSTR)TaskProcName)) { 
                       hProc(); 
                       __try { 
                             WaitForSingleObject(hConfigMutex, INFINITE); 
                             ((struct TASKENTRY*)ThreadParm)->Active = 
FALSE; 
                             CloseHandle((HANDLE)((struct 
TASKENTRY*)ThreadParm)->TaskThread); 
                       } 
                       __finally { 
                             ReleaseMutex(hConfigMutex); 
                       } 
                 } else LogEvent(EVENTLOG_ERROR_TYPE, "Error Getting 
Procedure Address"); 
            } else     LogEvent(EVENTLOG_ERROR_TYPE, "Error Getting 
TermProc Address"); 
      } else { 
            ReleaseMutex(hConfigMutex); 
            LogEvent(EVENTLOG_ERROR_TYPE, "Error Loading Library"); 
      } 
      InterlockedDecrement(&TaskCount); 
      return 0; 
} 
void  AnalyseTaskTable() 
{ 
      DWORD CurrTime; 
      int        i; 
      CurrTime = GetTimeInMins(); 
      __try { 
            WaitForSingleObject(hConfigMutex, INFINITE); 
            for (i = 0; i < EntryCount; i++) { 
                 if ((TaskTable[i].ExecTime == CurrTime) && 
                       (!TaskTable[i].Active)) { 
                             CreateThread(NULL, 0, TaskProc, &TaskTable[i], 
0, &TaskTable[i].TaskThread); 
                 } 
            } 
      } 
      __finally { 
            ReleaseMutex(hConfigMutex); 
      } 
} 
DWORD GetTimeInMins() 
{ 
      SYSTEMTIME SysTime; 
      GetLocalTime(&SysTime); 
      return SysTime.wHour*60+SysTime.wMinute; 
} 
void  TerminateTasks() 
{ 
      int   i; 
      DWORD TaskIndex = 0; 
      HANDLE     Handles[TASK_COUNT]; 
      for (i = 0; i < EntryCount; i++) { 
            if (TaskTable[i].Active) { 
                 TaskTable[i].TermProc(); 
                 Handles[TaskIndex++] = (HANDLE)TaskTable[i].TaskThread; 
            } 
      } 
      WaitForMultipleObjects(TaskIndex, Handles, TRUE, INFINITE); 
} 
Comm.h 
/* this ALWAYS GENERATED file contains the definitions for the interfaces 
*/ 
/* File created by MIDL compiler version 3.00.15 */ 
/* at Tue Jun 03 11:35:46 1997 
 */ 
/* Compiler settings for comm.idl: 
    Os, W1, Zp8, env=Win32, ms_ext, c_ext, oldnames 
    error checks: none 
*/ 
//@@MIDL_FILE_HEADING(  ) 
#include "rpc.h" 
#include "rpcndr.h" 
#ifndef __comm_h__ 
#define __comm_h__ 
#ifdef __cplusplus 
extern "C"{ 
#endif 
/* Forward Declarations */ 
void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); 
void __RPC_USER MIDL_user_free( void __RPC_FAR * ); 
#ifndef __CommService_INTERFACE_DEFINED__ 
#define __CommService_INTERFACE_DEFINED__ 
/**************************************** 
 * Generated header for interface: CommService 
 * at Tue Jun 03 11:35:46 1997 
 * using MIDL 3.00.15 
 ****************************************/ 
/* [implicit_handle][version][uuid] */ 
void RefreshIniProps( void); 
extern handle_t CommServ_IfHandle; 
extern RPC_IF_HANDLE CommService_ClientIfHandle; 
extern RPC_IF_HANDLE CommService_ServerIfHandle; 
#endif /* __CommService_INTERFACE_DEFINED__ */ 
/* Additional Prototypes for ALL interfaces */ 
/* end of Additional Prototypes */ 
#ifdef __cplusplus 
} 
#endif 
#endif 
DoService.h 
/**************************************************************/ 
/* DoService Module - implementation of initialisation other 
/*                      tasks                                 */ 
/*                                                            */ 
/*                    Copuright (c) 1997 by Malkov O.V.       */ 
/*                             JSC "Svyazinform" RM           */ 
/**************************************************************/ 
#ifndef __DOSERVICE 
#define __DESERVICE 
void ServerProcess(); 
DWORD ServerInit(); 
void ServerDoPause(); 
void ServerDoStop(); 
void ServerDoContinue(); 
#endif 
CommonConfig.h 
/**************** Server Engine Header File *******************/ 
#ifndef __COMMON_CONFIG 
#define __COMMON_CONFIG 
#define TASK_COUNT 10 
#include "../RegistryConfig.h" 
extern DWORD ConfigWatchingThread; 
extern HANDLE hConfigMutex; 
extern HANDLE hTaskMutex; 
extern unsigned char *pszProtocolSequence; 
extern unsigned char *pszSecurity; 
extern unsigned char *pszEndpoint; 
extern unsigned int   cMinCalls; 
extern unsigned int   cMaxCalls; 
extern unsigned int   fDontWait; 
extern struct    TASKENTRY TaskTable[TASK_COUNT]; 
extern int       EntryCount; 
extern DWORD     TaskThreads[TASK_COUNT]; 
extern int       TaskCount; 
DWORD WINAPI CommonConfigWatcher(LPVOID ThreadParm); 
void UpdateVariables(); 
#endif 
EventLog.h 
#ifndef __EVENT_LOG 
#define __EVENT_LOG 
void LogEvent(WORD EventType, LPSTR EventMsg); 
#endif 
ClientHandler.h 
#ifndef __CLIENT_HANDLER 
#define __CLIENT_HANDLER 
extern DWORD     ClientHandlingThread; 
DWORD WINAPI RPCClientHandling(LPVOID ThreadParm); 
void RefreshIniProps(); 
#endif 
ShedulerServ.h 
#ifndef __SHEDULING_SERVICE 
#define __SHEDULING_SERVICE 
#define TaskProcName "TaskProc" 
extern BOOL  TerminateSheduling; 
extern DWORD ShedulingThread; 
DWORD WINAPI ShedulingProc(LPVOID ThreadParm); 
void  TerminateTasks(); 
#endif 
RegistryConfig.h 
#ifndef __REGISTRY_CONFIG 
#define __REGISTRY_CONFIG 
#define REGISTRY_TASKS_PATH "SOFTWARE\\Svyazinform\\CommService\\Tasks" 
struct TASKENTRY 
{ 
      DWORD ExecTime; 
      char  DllName[256]; 
      FARPROC    TermProc; 
      DWORD TaskThread; 
      BOOL  Active; 
}; 
#endif 
Comm.idl 
/* IDL File  */ 
[ uuid (4a25d2e0-6703-11d0-8927-00a02413850e), 
  version(1.0) 
] 
interface CommService 
{ 
void RefreshIniProps(); 
} 
Comm.acf 
/* acf file for TimeInclude Service (RPC) */ 
[ implicit_handle(handle_t CommServ_IfHandle) 
]interface CommService 
{ 
} 
Приложение 4 
 Исходные тексты программы установки коммуникационного сервиса 
#include  
#include  
void RegEventSource(); 
VOID _CRTAPI1 main(void) 
{ 
  LPCTSTR lpszBinaryPathName = 
        TEXT("c:\\ibserver\\bin\\CommServ.exe"); 
  SC_HANDLE schSCManager; 
  SC_HANDLE schService; 
  /* Open a handle to the SC Manager database. */ 
  schSCManager = OpenSCManager( 
       NULL,                   /* local machine           */ 
     NULL,                   /* ServicesActive database */ 
     SC_MANAGER_ALL_ACCESS); /* full access rights      */ 
  if (schSCManager == NULL) { 
        printf("\nError opening Service Manager.\n"); 
        return; 
  } 
  schService = CreateService( 
       schSCManager,              /* SCManager database      */ 
       TEXT("CommServ"),        /* name of service         */ 
        TEXT("JSC \"SvjazInform\" Communication Service"),          /* 
service name to display */ 
       SERVICE_ALL_ACCESS,        /* desired access          */ 
       SERVICE_WIN32_OWN_PROCESS, /* service type            */ 
       SERVICE_DEMAND_START,      /* start type              */ 
       SERVICE_ERROR_NORMAL,      /* error control type      */ 
       lpszBinaryPathName,        /* service's binary        */ 
       NULL,                      /* no load ordering group  */ 
       NULL,                      /* no tag identifier       */ 
       NULL,                      /* no dependencies         */ 
       NULL,                      /* LocalSystem account     */ 
       NULL);                     /* no password             */ 
  if (schService == NULL) { 
      printf("\nFailed to create service!\n"); 
  } 
  else 
      printf("CreateService SUCCESS\n"); 
  CloseServiceHandle(schService); 
  CloseServiceHandle(schSCManager); 
  RegEventSource(); 
} 
void RegEventSource() 
{ 
      HKEY hk; 
      DWORD dwData; 
      UCHAR szBuf[80]; 
      if (RegCreateKey(HKEY_LOCAL_MACHINE, 
"SYSTEM\\CurrentControlSet\\Services\ 
            \\EventLog\\Application\\CommServ", &hk)) { 
            printf("could not create registry key"); 
            return; 
      } 
      /* Set the Event ID message-file name. */ 
      strcpy(szBuf, "c:\\ibserver\\bin\\CommServ.exe"); 
      /* Add the Event ID message-file name to the subkey. */ 
      if (RegSetValueEx(hk,             /* subkey handle   */ 
                "EventMessageFile",       /* value name     */ 
                 0,                        /* must be zero  */ 
                  REG_EXPAND_SZ,            /* value type   */ 
                 (LPBYTE) szBuf,           /* address of value data */ 
                 strlen(szBuf) + 1))       /* length of value data*/ 
      { 
            printf("could not set event message file"); 
            return; 
      } 
      /* Set the supported types flags. */ 
      dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
          EVENTLOG_INFORMATION_TYPE; 
      if (RegSetValueEx(hk,      /* subkey handle          */ 
                 "TypesSupported",  /* value name           */ 
                 0,                 /* must be zero         */ 
                 REG_DWORD,         /* value type           */ 
                 (LPBYTE) &dwData,  /* address of value data*/ 
                 sizeof(DWORD)))    /* length of value data */ 
      { 
          printf("could not set supported types"); 
            return; 
      } 
      RegCloseKey(hk); 
 } 
Приложение 5 
 Исходные тексты программы удаления коммуникационного сервиса 
#include  
#include  
void CleanRegistry(); 
VOID _CRTAPI1 main(void) 
{ 
  SC_HANDLE schSCManager; 
  SC_HANDLE schService; 
  /* Open a handle to the SC Manager database. */ 
  schSCManager = OpenSCManager( 
       NULL,                   /* local machine           */ 
     NULL,                   /* ServicesActive database */ 
     SC_MANAGER_ALL_ACCESS); /* full access rights      */ 
  if (schSCManager == NULL) { 
        printf("\nError opening Service Manager.\n"); 
        return; 
  } 
  schService = OpenService( 
       schSCManager,       /* SCManager database      */ 
       TEXT("CommServ"), /* name of service         */ 
       DELETE);            /* only need DELETE access */ 
  if (! DeleteService(schService) ) 
      printf("\nFailed to Delete service!\n"); 
  else 
      printf("DeleteService SUCCESS\n"); 
  CloseServiceHandle(schService); 
  CloseServiceHandle(schSCManager); 
} 
void CleanRegistry() 
{ 
      if (RegDeleteKey(HKEY_LOCAL_MACHINE, 
"SYSTEM\\CurrentControlSet\\Services\ 
\\EventLog\\Application\\CommServ")) 
      { 
            printf("\nError Cleaning Registry"); 
      } else { 
            printf("\nCleaning Registry SUCCESS"); 
      } 
      return; 
} 
Приложение 6 
Структуры баз данных 
Страницы: 1, 2, 3, 4, 5 
	
	
					
							 |