Организация удаленного доступа к распределенным базам данных
| |календарного графика работы | | | | | |
|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
|