Смекни!
smekni.com

Разработка вспомогательной системной программы в системе программирования Delphi с использованием средств WinApi (стр. 4 из 8)

1) Тестирование процедуры выполняющей запись данных в проецируемый файл(2 этап выполнения программы). В данном случае это является первым заданием курсового проекта - обмен данными между приложениями с помощью файла проецируемого в память.

1инициализация

2if Edit1.Text <> '' then

Begin

WriteDataInMMF(Nicname+' Написал:'+#13#10+string(Edit1.Text));

(тело функции WriteDataInMMF(вхдными данными является строка S)

имеетследующийвид):

begin

3 WaitForSingleObject(HMutex, INFINITE);

PBaseAdress:=MapViewOfFile(HFileSender,FILE_MAP_WRITE,0,0,Length(s)+4);

4 if(PBaseAdress = nil) then

begin

5 CloseHandle(HFileSender);

st:='не удалось передать данные';

Application.MessageBox(st,'Сообщение...',MB_OK);

exit;

end;

begin

6 integer(PBaseAdress^):=length(s);

CopyMemory(Pointer(Integer(PBaseAdress)+4),PChar(s),length(s));

UnmapViewOfFile(PBaseAdress);

SetEvent(HEvent);

ReleaseMutex(HMutex);

7 end;

8 end;

9 Edit1.Text:='';

10 end

else

11 exit;

12 end;


Рисунок 4.1 – Потоковый граф обработчика события «Событие1» которое происходит при нажатии на кнопку «ОТПРАВИТЬ» на основной форме программы.

Цикломатическая сложность потокового графа:

1) V(G) = 3 региона;

2) V(G) = 13 дуг - 12 узлов + 2 = 3;

3) V(G) = 2 предикатных узла +1 = 3.

Базовое множество независимых линейных путей:

Путь 1:1-2-11-12 .

Путь 2: 1-2-3-4-5-12.

Путь 3: 1-2-3-4-5-6-7-8-9-10-12.

Таблица тестовых вариантов 4.1

пути

Исходные данные Ожидаемые результаты Реальные результаты
1 Строка содержащая, которая должна содержать текст сообщения пуста Не происходит отправки пустого сообщения Состояние программы после перехода на главную форму не
2 Не удалось отобразить файл на адресное пространство процесса при обращении к дескриптору файла , проецируемого в память.

Сообщение:

«Не удалось отобразить файл на адресное пространство процесса»..

Сообщение:

«Не удалось отобразить файл на адресное пространство процесса».

3 Текст сообщения: «Привет!» Появление текста «Привет!» в поле истории переписки. Удачный исход – появление текста «Привет!» в поле истории переписки

2) Тестирование процедуры выполняющей создание дескрипторов логического диска с

которым ведётся работа и дескриптора жёсткого диска которому принадлежит этот логический диск(3 этап выполнения программы ).

1 инициализация

2 if hDrive <> 0 then

3CloseHandle(hDrive);

4 if hMBRDrive <> 0 then

5CloseHandle(hMBRDrive);

6 discNameBPB:='&bsol;.&bsol;'+DriveComboBox1.Drive+':';

discNameMBR:='&bsol;.&bsol;PHYSICALDRIVE'+intToStr(0);

hMBRDrive:= CreateFile(PChar(discNameMBR),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

hDrive:= CreateFile(PChar(discNameBPB),GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);

7 if (hDrive <> INVALID_HANDLE_VALUE) and (hMBRDrive <> INVALID_HANDLE_VALUE) then

begin

8 Result := DeviceIoControl(hDrive,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,

@DiscGeometry,SizeOf(TDiscGeometry),junk,nil) and (junk = SizeOf(TDiscGeometry));

DiscGeometryShow();

9 end

else

begin

10 ShowMessage('неудалосьсоздатьдескрипторыдисков');

11 exit;

end;

12 end;


Рисунок 4.2 Потоковый граф обработчика события «С1» которое происходит при нажатии на кнопку «Начать работу с диском»

Цикломатическая сложность потокового графа:

1) V(G) = 4 регионов;

2) V(G) = 14 дуга - 12 узлов + 2 = 4;

3) V(G) = 3 предикатных узлов +1 = 4.

Путь 1:1-2-4-6-7-10-11-12;

Путь 2:1-2-3-4-6-7-10-11-12.

Путь 3: 1-2-4-5-6-7-10-11-12.

Путь 4:1-2-3-4-5-7-8-9-12.

пути

Исходные данные Ожидаемые результаты Реальные результаты
1 Дескрипторы файлов не созданы . Невозможно получить данные о носителе вывод сообщения: «Не удалось создать дескрипторы файлов»

Вывод сообщения

«Не удалось создать дескрипторы файлов»

2

Создан дескриптор файла BPB

Невозможно получить данные о носителе вывод сообщения: «Не удалось создать дескрипторы файлов»

Вывод сообщения

«Не удалось создать дескрипторы файлов»

3 Создан дескриптор файла MBR Невозможно получить данные о носителе вывод сообщения: «Не удалось создать дескрипторы файлов»

Вывод сообщения

«Не удалось создать дескрипторы файлов»

4 Дескрипторы файлов существуют как MBR так и BPB Загрузка данных о носителе. Загрузка данных о носителе.

3) Тестирование процедуры считывающей блок параметров Bios- событие «С2» (происходит при нажатии на кнопку «Считать BPB»)логического диска

дескриптор которого был создан в процедуре обрабатывающей событие «С1» при нажатии на кнопку «Начать работу с диском»

1инициализация

2IfReadSectors(hDrive,0,1,@buffer,DiscGeometry.BytesPerSector) = DiscGeometry.BytesPerSector then

begin

3for i:= 1 to 16 do

4Grid1.Cells[i,0]:=intToHex((i-1),1);

5i:=1; j:=1; k:=1;

6while k<=DiscGeometry.BytesPerSector do

begin

7 if i=1 then

8 Grid1.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);

9 Grid1.Cells[i,j]:=IntToHex(Buffer[k],2);

inc(k);

inc(i);

10 if i>16 then

begin

11 i:=1;

j:=j+1;

Grid1.RowCount:= Grid1.RowCount+1;

12end;

13end;

14{линейный блок расшифровки данных BPB}

end

else

15ShowMessage(‘неудалосьсчитать BPB’);

16end

17end;

программа многопоточный приложение служебный


Рисунок 4.3 – Потоковый граф обработчика события С2 (Считывание блока параметров Bios).


Цикломатическая сложность потокового графа:

1) V(G) = 6 регионов;

2) V(G) = 21дуг - 17 узлов + 2 = 6;

3) V(G) = 5 предикатных узлов +1 = 6.

Путь 1:1-2-15-16-17;

Путь 2:1-2-3-4-5-6-7-9-10-12-13-14-17.

Путь 3: 1-2-3-4-5-6-7-8-9-10-12-13-14-16-17.

Путь 4:1-2-3-4-5-6-7-9-10-11-12-13-14-16-17.

Путь 5:1-2-3-4-5-6-7-8-9-10-11-12-13-14-16-17.

Путь 6: 1-2-3-4-3-4-5-6-7-9-10-12-13-6-7-8-9-10-11-12-13-14-16-17.

пути

Исходные данные Ожидаемые результаты Реальные результаты
1 Не удалось считать сектор BPB . Вывод сообщения о том, что считать BPB не удалось Вывод сообщения: « не удалось считать BPB»
2 Часть данных считана , при этом номер строки остаётся прежним и номер элемента строки не достиг 16. Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h» Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»
3 Чтение данных началось и строка получила значение Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h» Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»
4 Строка считана и номер элемента в строке достиг 16 Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h» Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»
5 Строка получила номер и элемент в строке достиг 16 Вывод данных в таблицу, содержащую данные о BPB,например команду перехода на программу загрузки: «EB0090h» Вывод данных в таблицу, содержащую данные о BPB: команда перехода на программу загрузки: «EB0090h»
6 Чтение данных из буфера в течении нескольких проходов циклов с изменением номера строк и столбцов таблицы , содержащей значения BPB Пошаговый вывод данных в таблицу содержащую 16рмчные значения и вывод данных в таблицу содержащую расшифрованные значения Обе таблицы «Шестнадцатиричное представление BPB логического диска» и «Расшифровка блока параметров BIOS» заполняются необходимыми значениями

4) Тестирование процедуры, считывающей таблицу разделов носителя(событие «С3» - происходит при нажатии на кнопку «Считать PartitionTable»), к которому принадлежит ,выбранный из выпадающего списка логический диск

1инициализация.

2Memo2.Clear;

3If.ReadSectors(hMBRDrive,0,1,@buffer,DiscGeometry.BytesPerSector)= DiscGeometry.BytesPerSector then

begin

4for i:= 1 to 16 do

5Grid2.Cells[i,0]:=intToHex((i-1),1);

6i:=1; j:=1; k:=1;

7while k<=DiscGeometry.BytesPerSector do

begin

8if i=1 then

9Grid2.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);

10Grid2.Cells[i,j]:=IntToHex(Buffer[k],2);

inc(k);

inc(i);

11if i>16 then

begin

12 i:=1;

j:=j+1;

Grid2.RowCount:= Grid2.RowCount+1;

13 end;

14end;

begin

15{Линейный блок расшифровки значений полученных в буфере после чтения сектора}

16end

else

17ShowMessage('Неудалосьсчитатьблок PartitionTable');

18end;


Рисунок 4.4 – Потоковый граф обработчика события «С3» (кнопка «Считать PartitionTable »)


Цикломатическая сложность потокового графа:

1) V(G) = 6 регионов;

2) V(G) = 22 дуга - 18 узлов + 2 = 6;

3) V(G) = 5 предикатных узлов +1 = 6.

Путь 1:1-2-17-18;

Путь 2:1-2-3-4-5-6-7-8-10-11-13-14-15-16-18;

Путь 3:1-2-3-4-5-6-7-8-9-10-11-13-14-15-16-18;

Путь 4: 1-2-3-4-5-6-7-8-10-11-12-13-14-15-16-18;

Путь 5: 1-2-3-4-5-4-5-6-7-8-9-10-11-13-14-15-16-18;

Путь 6: 1-2-3-4-5-4-5-6-7-8-10-11-12-13-14-7-8-9-10-11-13-14-15-16-18;

№ пути Исходные данные Ожидаемые результаты Реальные результаты
1 Если не удалось считать PartitionTable Должно появиться сообщение о том , что не возможно считать PartitionTable

Вывод сообщения:

«Не удалось считать PartitionTable»

2 Происходить считывание элемента массива , который имеет номер отличающийся от 1 и от 16. Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }» Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»
3 Считывание элемента массива , который имеет номер 1 в строке таблицы Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }» Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»
4 Считывание элемента, который имеет последний номер в строке (16) Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }» Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»
5 Считывание данных из массива. При прохождении этого пути проверяется заполнение верхней строчки таблицы номерами от 0 до F. Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }» Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»
6 Считывание данных из массива. Когда элемент имеет номер 16 в строке, а последующий элемент имеет номер 1 в след. строке. Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }» Вывод данных, например: «Начало раздела диска{Головка: 255 Сектор: 255 Цилиндр: 15 }»

Дополнительный тест