структура DOCEVENT_FILTER (winddiui.h)
Структура DOCEVENT_FILTER содержит список событий документа, на которые будет отвечать драйвер принтера. Полный список событий документа см. в разделе DrvDocumentEvent .
Синтаксис
typedef struct _DOCEVENT_FILTER {
UINT cbSize;
UINT cElementsAllocated;
UINT cElementsNeeded;
UINT cElementsReturned;
DWORD aDocEventCall[ANYSIZE_ARRAY];
} DOCEVENT_FILTER, *PDOCEVENT_FILTER;
Члены
cbSize
Размер этой структуры в байтах, предоставленный диспетчером очереди. Диспетчер очереди инициализирует этот элемент в sizeof(DOCEVENT_FILTER).
cElementsAllocated
Предоставленное spooler количество элементов в элементе массива aDocEventCall . Очередь очереди инициализирует этот элемент DOCUMENTEVENT_LAST – 1. (Константу DOCUMENTEVENT_LAST определяется в файле заголовка Winddiui.h.)
cElementsNeeded
Предоставленное драйвером общее количество элементов, необходимых в элементе массива aDocEventCall . Очередь очереди инициализирует этот элемент для 0XFFFFFFFF. Дополнительные сведения см. в разделе "Примечания".
cElementsReturned
Указанное драйвером количество событий DOCUMENTEVENT_**XXX**, которые он помещал в элемент массива aDocEventCall . Очередь очереди инициализирует этот элемент для 0XFFFFFFFF. Дополнительные сведения см. в разделе "Примечания".
aDocEventCall[ANYSIZE_ARRAY]
Заполненный драйвером массив DWORD со списком всех событий DOCUMENTEVENT_XXX, на которые будет отвечать драйвер принтера. Диспетчер очереди инициализирует этот элемент значением 0.
Комментарии
Драйвер принтера перечисляет события, на которые он будет отвечать в структуре DOCEVENT_FILTER. Так как это ограничивает количество вызовов драйвера, необходимого для очереди очереди, производительность принтера повышается. Когда диспетчер очереди очереди выполняет вызов DDI DrvDocumentEvent с параметром iEsc , заданным DOCUMENTEVENT_QUERYFILTER, диспетчер очереди очереди выделяет буфер, содержащий структуру DOCEVENT_FILTER, включая его массив aDocEventCall . Объем памяти, выделенный для буфера:
sizeof(DOCEVENT_FILTER) + sizeof(DWORD) * (DOCUMENTEVENT_LAST - 2)
После выделения буфера, содержащего структуру DOCEVENT_FILTER, диспетчер очереди очереди инициализирует члены структуры следующими значениями:
Член | Инициализировано в |
---|---|
cbSize | 0 |
cElementsAllocated | DOCUMENTEVENT_LAST - 1 Константу DOCUMENTEVENT_LAST определяется в файле winddiui.h. |
cElementsNeeded | 0XFFFFFFFF |
cElementsReturned | 0XFFFFFFFF |
aDocEventCall | 0 |
После того как диспетчер очереди инициализирует элементы структуры значениями, показанными в предыдущей таблице, он вызывает DrvDocumentEvent. Когда эта функция возвращается, диспетчер очереди очереди проверяет элементы cElementsNeeded и cElementsReturned , чтобы проверить, были ли изменены элементы. Если драйвер записывает данные в один из этих элементов, но не в другой, диспетчер очереди печати интерпретирует неписаный элемент как имеющий значение 0.
Если драйвер поддерживает DOCUMENTEVENT_QUERYFILTER:
Если массив aDocEventCall достаточно велик, чтобы содержать все события DOCUMENTEVENT_XXX, которые драйвер принтера планирует разместить в нем, драйвер принтера:
Заполняет массив этими событиями
Задает член cElementsReturned таким числом событий (которое должно быть меньше или равно cElementsAllocated).
Оставляет cElementsNeed без изменений
Возвращает DOCUMENTEVENT_SUCCESS
В этом случае очередь очереди использует первые значения cElementsReturned в массиве aDocEventCall .
Событие DOCUMENTEVENT_CREATEDCPRE обрабатывается особым образом. Когда spooler вызывает DrvDocumentEvent с параметром iEsc, для параметра iEsc задано значение DOCUMENTEVENT_CREATEDCPRE, он использует возвращаемое значение, чтобы определить, необходимы ли будущие вызовы этой функции. В отличие от других событий DOCUMENTEVENT_XXX драйвер принтера всегда принимает вызовы DrvDocumentEvent с DOCUMENTEVENT_CREATEDCPRE независимо от того, отфильтровывается это событие или нет.
Если массив aDocEventCall недостаточно велик, чтобы содержать все события DOCUMENTEVENT_XXX , которые драйвер принтера планирует разместить в нем, драйвер принтера должен:
Задайте для параметра cElementsNeeded значение количества событий, на которые он намерен отвечать (которое должно быть больше , чем cElementsAllocated).
Оставьте cElementsReturned без изменений
Возврат DOCUMENTEVENT_SUCCESS
В этом случае очередь очереди выделяет новый достаточно большой буфер, а затем выполняет еще один вызов DrvDocumentEvent с DOCUMENTEVENT_QUERYFILTER.
Если драйвер не поддерживает событие DOCUMENTEVENT_QUERYFILTER, он должен вернуть DOCUMENTEVENT_UNSUPPORTED. Если драйвер поддерживает DOCUMENTEVENT_QUERYFILTER, но при обработке этого события возникают внутренние ошибки, он должен вернуть DOCUMENTEVENT_FAILURE. В любом случае диспетчер очереди очереди не может получить фильтр событий из драйвера, поэтому он продолжает вызывать DrvDocumentEvent для всех событий.
Требования
Требование | Значение |
---|---|
Заголовок | winddiui.h (включая Winddiui.h) |