Отладка приложений


         

Основные моменты реализации


Одной из первичных целей реализации DeadlockDetection была организация управления этой утилитой как с помощью данных, так и с помощью таблиц. Если немного отстраниться и посмотреть на то, чем занимается DLL при обработке подключения, то нетрудно заметить, что для каждой функции из табл. 12.1 обработка почти идентична. Подключаемая функция вызывается, определяет, ее ли класс функций контролируется, вызывает реальную функцию и (если регистрация для этого класса включена) регистрирует информацию, после чего выполняет возврат в вызывающую программу. Надо было написать набор аналогичных функций подключения, причем сделать их как можно более простыми. Сложные функции подключения — идеальная питательная почва для размножения ошибок.

Чтобы показать эту простоту, поговорим о том, как была написана DeadDetExt DLL. DeadDetExt DLL должна иметь три экспортируемых функций. Две первых — DeadDetExtOpen И DeadDetExtClose — самоочевидны. Интересна функция DeadDet, которую вызывает каждая функция подключения, когда имеется информация для записи. DeadDetProcessEvent принимает единственный параметр — указатель на структуру DDEVENTINFO:

typedef struct tagDDEVENTINFO 

{

// Идентификатор, который указывает, что содержит остальная часть

// этой структуры

eFuncEnum eFunc ;

// Индикатор pre- или post-вызова 

ePrePostEnum ePrePost ;

// Адрес возврата. Этот адрес помогает в нахождении вызова

// функции.

DWORD dwAddr;

// ID вызывающего потока

DWORD dwThreadld;

// Возвращаемое значение для post-вызовов.

DWORD dwRetValue ;

// Информация параметра. Преобразовать тип этой информации

//в подходящую структуру для функции (как описано ниже).

// При доступе к параметрам трактовать их как read-only

// (только-для-чтения).

DWORD dwParams 

} DDEVENTINFO-, * LPDDEVENTINFO;

Полный вывод для единственной функции, которая появляется в листинге 12-1, формируется информацией структуры DDEVENTINFO. Большинство полей в ней самоочевидны, но поле dwParams нуждается в специальном упоминании.

Содержание  Назад  Вперед