Курсовая работа: Разработка вспомогательной системной программы в системе программирования Delphi с использованием средств WinApi
4. Эксплуатационные документы
4.1 Руководство программиста
4.1.1 Общие сведения о программе
Программа предназначена для обмена сообщениями между копиями этой программы с помощью файла, проецируемого в память. А также для анализа рабочей области системного диска, т.е анализ и расшифровку блока параметров Bios и анализ и расшифровку таблицы разделов носителя.
4.1.2 Структура программы
После запуска приложения появляется форма «Авторизация» для присвоения пользователя специального псевдонима для обмена информацией. Форма содержит две кнопки: «Войти» и «Закрыть». По нажатию кнопки «закрыть» происходит выход из приложения. По нажатию кнопки «войти» происходит переход на основную форму программы, данная форма содержит поле вывода сообщений – «поле истории переписки», также поле ввода сообщений, кнопку «ОТПРАВИТЬ» для отправки сообщений, а также кнопки отсоединиться, закрыть и соединится, которая будет появится на форме только после нажатия на кнопку «отсоединиться». Также на форме присутствует панель инструментов с кнопками :
1. Сохранить историю переписки,
2. Загрузить историю переписки.
3. Получить данные о носителях.
4. Справка.
При нажатии на первую кнопку появляется диалоговое окно, в котором необходимо выбрать файл, содержащий историю переписки, если такой имеется, и вывод содержимого этого файла в поле истории переписки.
При нажатии на вторую кнопку происходит открытие диалогового окна, в котором предлагается назначить сохраняемому файлу имя и каталог, в котором данный файл будет сохранён. Содержимым данного файла будет являться история последней переписки.
При нажатию на четвёртую кнопку происходит запуск файла справочной системы, содержащей всю необходимую информацию о программе.
При нажатии на третью кнопку происходит открытие дополнительного окна программы.
Дополнительное окно программы имеет заголовок «Служебная информация о носителях». Это окно содержит поле вывод информации о всех носителях присутствующих в системе . Поле вывода краткой информации о носителе, поле вывода расшифрованной информации о блоке параметров Bios, поле вывода расшифрованной информации о таблице разделов носителя, а также две таблицы, содержащие 16ричные значения первого сектора логического диска- блок параметров Bios и 16ричные значения первого сектора носителя, к которому относится выбранный логический диск (в этом секторе находится таблица разделов логического диска – Partition Table). Также на форме находятся 4 кнопки:
1. Начать работу с диском
2. Считать BPB(блок параметров Bios)
3. Считать Partition Table.
4. Закрыть.
При нажатии на первую кнопку происходит вывод краткой информации о носителе. При нажатии на кнопку «Считать BPB» происходит считывание блока BPB и заполнение значениями таблицы содержащей расшифрованные данные из BPB и таблицы, содержащей 16ричные значения считанные из BPB, выбранного логического диска.
При нажатии на кнопку – «Считать Partition Table» происходит считывание первого сектора носителя информации и заполнение данными таблицы, содержащей расшифрованные данные о таблице разделов диска и таблицы содержащей 16ричные значения считанные из первого сектора носителя.
4.1.3 Проверка программы
Входные данные : строка сообщения «сообщение №1»; логический диск «H».
Выходные данные : «сообщение№1»;
Краткая информация о носителе:
«Вы просматриваете логический диск: h
Количество цилиндров: 247
Тип носителя: съёмный носитель
Дорожек на цилиндре: 255
Секторов на дорожке: 63
Байт в секторе: 512»
Информация о таблице разделов диска:
Первый элемент таблицы разделов системного диска:
Признак загрузки: 80
Начало раздела диска{Головка: 1 Сектор: 1 Цилиндр: 0 }
Тип раздела {Ос: 7 }
Конец раздела диска{Головка: 254 Сектор: 255 Цилиндр: 255 }
Номер Сектора {: 63 }
Размер раздела {: 61432497 }
Второй элемент таблицы разделов системного диска:
Признак загрузки: 00
Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }
Тип раздела {Ос: 254 }
Конец раздела диска{Головка: 255 Сектор: 255 Цилиндр: 240 }
Номер Сектора {: 61432560 }
Размер раздела {: 318782480 }
4.1.4 Дополнительные возможности
Программа имеет справочную систему, для её запуска необходимо нажать кнопку , или F1 на клавиатуре. Также программа определяет носители доступные в системе, это происходит автоматически при переходе на третью форму программы.
4.1.5 Сообщения системному программисту
1) При подключении, если не удалось создать проекцию файла при запуске программы, появляется сообщение:
Рисунок 5.1 –Содержание сообщения
2)Если не удалось создать объект типа Mutex для обмена сообщениями с другими программами, появляется сообщение:
Рисунок 5.2 – Содержание сообщения.
3) Если не удалось наладить приём сообщений от других копий программ, появляется сообщение:
Рисунок 5.3 – Текст сообщения.
4) Если не удалось создать объект типа события для оповещения потока о том, что данные записаны в проецируемый файл, появляется сообщение:
Рисунок 5.4 –Текст сообщения.
5) Если не удалось передать данные (записать данные в проецируемый файл) , появляется сообщение:
Рисунок 5.6 – Текст сообщения.
4.2 Руководство пользователя
4.2.1 Назначение и условия выполнения программы
Данная программа предназначена для обмена сообщениями между копиями данной программы, а также для получения системной информации о носителях. Для выполнения программы необходим IBM-совместимый персональный компьютер, оснащенный процессором Intel или аналогичным и операционной системой семейства Windows.
4.2.2 Обращение к программе для запуска:
Для запуска программы необходимо запустить приложение с Redactor.exe . Это делается с помощью ярлыка , который появляется на рабочем столе после установки, с именем OffClient.
4.2.3 Входные и выходные данные:
Входными и выходными данными при обмене сообщениями являются сами сообщения. При получении служебных данных о носителях входными данными являются имена этих носителей, а выходными – данные о них, такие как:
Количество цилиндров, тип носителя, дорожек на цилиндре, секторов на дорожке, байт в секторе и т.д.
4.2.4 Сообщения оператору:
1) Если не введён псевдоним при регистрации то появится сообщение:
Рисунок 5.7 - Текст сообщения.
2) Если не удалось передать сообщение:
Рисунок 5.8 – Текст сообщения.
Приложение
1) Текст основного модуля программы
program Redactor;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
ThrdRcvr in 'ThrdRcvr.pas',
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
HDDInfo in 'HDDInfo.pas';
{$R *.res}
begin
Application.Initialize;
Application.HelpFile:='СПРАВКА.HLP';
Application.CreateForm(TForm1, Form1);
Application.ShowMainForm:=false;
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
2) Текст модуля Unit1:
unit Unit1; //Основной модуль
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ThrdRcvr,
StdCtrls, Buttons, Menus,ToolWin, ComCtrls, ActnMan, ActnColorMaps,
ImgList, ExtCtrls,Unit3;
const
MMFName:PChar = 'MMFProectFile';
MutxName:PChar = 'UniqMutexName';
EvntName:Pchar = 'ChatEventName';
SHARED_MEMORY_SIZE = 65536;
type
TForm1 = class(TForm)
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
MainMenu1: TMainMenu;
N1: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
ToolBar1: TToolBar;
OpenToolButton: TToolButton;
SaveAsToolButton: TToolButton;
ToolButton3: TToolButton;
ImageList1: TImageList;
StatusBar1: TStatusBar;
Timer1: TTimer;
ToolButton1: TToolButton;
N2: TMenuItem;
N8: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CloseHandles;
procedure CreateHandles;
procedure Button2Click(Sender: TObject);
procedure WriteDataInMMF(s:string);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure N5Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
procedure AppHint(Sender: TObject);
public
HMutex:THandle;
ThreadRec:TThreadReceiver;
HEvent:THandle;
HFileSender:Thandle;
NicName:string;
end;
var
Form1: TForm1;
TxtFile:TextFile;// пременная файла
St:PansiChar;
lincInt:Boolean;
TxtContaningStr:String;
userName:string;
implementation
{$R *.dfm}
//процедура для показа кртких справок
procedure TForm1.AppHint(Sender: TObject);
begin
StatusBar1.SimpleText:=Application.Hint; //для отображения ииформации в панели соостояния
end;
//закрытие всех хендлов в этой копии программы
procedure TForm1.CloseHandles();
begin
CloseHandle(HFileSender);
CloseHandle(HMutex);
CloseHandle(HEvent);
end;
// создание всех необходимых объектов
procedure TForm1.CreateHandles;
begin
// проекция файла
HFileSender:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SHARED_MEMORY_SIZE,MMFName);
lincInt:=(GetLastError() <> ERROR_ALREADY_EXISTS);
if HFileSender = 0 then
begin
st:='не удалось создать проекцию файла';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
// мьютекс
HMutex:=CreateMutex(nil,false,MutxName);
if HMutex = 0 then
begin
CloseHandle(HFileSender);
st:='не удалось синхронизировать приложение';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
// событие
HEvent:=CreateEvent(nil,true,false,EvntName);
if HEvent = 0 then
begin
CloseHandle(HFileSender);
CloseHandle(HMutex);
st:='не удалось осуществить обмен сообщениями';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
end;
// отсоединиться
procedure TForm1.Button1Click(Sender: TObject);
begin
ThreadRec.Terminate;
WriteDataInMMF('Пользователь '+NicName+' отключился');
ThreadRec.WaitFor;
ThreadRec.Free;// правильно уничтожаем поток
CloseHandles();
button2.Visible:=true;
button1.Visible:=false;
bitbtn2.Visible:=false;
end;
// загрузить историю переписки
procedure TForm1.N4Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
AssignFile(TxtFile,OpenDialog1.FileName);
Reset(TxtFile);
Memo1.Text:=Memo1.Text +'{-----------Загруженная переписка ниже-------------}' + #13#10;
while not eof(TxtFile) do
begin
readln(TxtFile,TxtContaningStr);
Memo1.Text:=Memo1.Text + TxtContaningStr + #13#10;
end;
Memo1.Text:=Memo1.Text +'{-----------Загруженная переписка выше -------------}' + #13#10;
CloseFile(TxtFile);
end;
end;
//процедура записи данных в MMF
procedure TForm1.WriteDataInMMF(s:string);
var
PBaseAdress:Pointer;
begin
WaitForSingleObject(HMutex, INFINITE);
PBaseAdress:=MapViewOfFile(HFileSender,FILE_MAP_WRITE,0,0,Length(s)+4);
if(PBaseAdress = nil) then
begin
CloseHandle(HFileSender);
st:='не удалось передать данные';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
begin
integer(PBaseAdress^):=length(s);
CopyMemory(Pointer(Integer(PBaseAdress)+4),PChar(s),length(s));
UnmapViewOfFile(PBaseAdress);
SetEvent(HEvent);
ReleaseMutex(HMutex);
end;
end;
// процедура записи данных в PBaseAdress
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if Edit1.Text <> '' then
begin
WriteDataInMMF(Nicname+' написал:'+#13#10+string(Edit1.Text));
Edit1.Text:='';
end
else
exit;
end;
// Закрытия формы
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close;
end;
//создаём хендлы и потоки
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
// создание потока принимающего данные из файла
ThreadRec:=TThreadReceiver.Create(false);
ThreadRec.Priority:=tpLowest;
CreateHandles();// создаем хендлы
end;
// соединение
procedure TForm1.Button2Click(Sender: TObject);
begin
CreateHandles();
ThreadRec:=TThreadReceiver.Create(false);
button2.Visible:=false;
button1.Visible:=true;
bitbtn2.Visible:=true;
WriteDataInMMF(NicName+' Cоединился!');
end;
// Запрос подтверждения при закрытии формы
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
case messageBox(Handle,'Действительно выйти?','Внимание!', MB_YESNO) of
IDYES:
begin
if Button1.Visible = true then
begin
ThreadRec.Terminate;
WriteDataInMMF('Пользователь '+NicName+' отключился');
ThreadRec.WaitFor;
ThreadRec.Free;
CanClose:=true;
end
else
CanClose:=true;
end;
IDNO: CanClose:=false;
end;
end;
//Сохранить историю переписки
procedure TForm1.N5Click(Sender: TObject);
begin
If SaveDialog1.Execute then
begin
AssignFile(TxtFile,SaveDialog1.FileName);
rewrite(TxtFile);
TxtContaningStr:= Memo1.Text;
Write(TxtFile,TxtContaningStr);
CloseFile(TxtFile);
St:='Файл сохранён';
Application.MessageBox(St,'Сообщение...',MB_OK);
exit;
end
else
begin
St:='файл не сохранён';
Application.MessageBox(St,'Сообщение...',MB_OK);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Form1.Visible = true then
begin
Application.OnHint:=AppHint;
Timer1.Enabled:=false;
Timer1.Destroy;
end;
end;
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
Application.CreateForm(TForm3, Form3);
Application.ShowMainForm:=false;
Form3.Visible:=true;
end;
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
//вызов справки (основная форма программы)
Application.HelpContext(2);
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Application.HelpCommand(HELP_FINDER,0);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
ShowMessage('Программу подготовил студент группы 742:'+#13#10+'Шипилов Д.А.');
end;
end.
3) Текст модуля Unit2 (Модуль формы «Авторизация»):