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

此结构的后台处理程序提供的大小(以字节为单位)。 后台处理程序将此成员初始化为 sizeofDOCEVENT_FILTER)。

cElementsAllocated

aDocEventCall 数组成员中提供后台处理程序提供的元素数。 后台处理程序将此成员初始化为 DOCUMENTEVENT_LAST - 1。 (头文件 Winddiui.h. 中定义了DOCUMENTEVENT_LAST常量)

cElementsNeeded

驱动程序提供的 aDocEventCall 数组成员中所需的元素总数。 后台处理程序将此成员初始化为0XFFFFFFFF。 有关详细信息,请参阅以下“备注”部分。

cElementsReturned

驱动程序提供的DOCUMENTEVENT_**XXX **事件数,它放置在 aDocEventCall 数组成员中。 后台处理程序将此成员初始化为0XFFFFFFFF。 有关详细信息,请参阅以下“备注”部分。

aDocEventCall[ANYSIZE_ARRAY]

DWORD 的驱动程序填充数组,其中列出了打印机驱动程序将响应的所有DOCUMENTEVENT_XXX 事件。 后台处理程序将此成员初始化为 0。

言论

打印机驱动程序列出将在DOCEVENT_FILTER结构中响应的事件。 由于这限制了后台处理程序需要对驱动程序的调用数,因此打印机性能会得到增强。 当后台处理程序调用 DrvDocumentEvent DDI 时,其 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

    • cElementsNeeded 不变

    • 返回DOCUMENTEVENT_SUCCESS

在这种情况下,后台处理程序使用 aDocEventCall 数组中的第一个 cElementsReturned 值。

DOCUMENTEVENT_CREATEDCPRE事件以特殊方式处理。 当后台处理程序使用设置为 DOCUMENTEVENT_CREATEDCPRE 的 iEsc 参数调用 DrvDocumentEvent 时,后台处理程序使用返回值来确定将来是否需要对此函数的调用。 与其他 DOCUMENTEVENT_XXX 事件不同,打印机驱动程序始终使用 DOCUMENTEVENT_CREATEDCPRE 接收对 DrvDocumentEvent 的调用,无论此事件是否被筛选掉。

  • 如果 aDocEventCall 数组不够大,无法包含打印机驱动程序打算放入其中的所有DOCUMENTEVENT_XXX 事件,打印机驱动程序应:

    • cElementsNeeded 设置为其要响应的事件数(应大于 cElementsAllocated

    • 保留 cElementsReturned 不变

    • 返回DOCUMENTEVENT_SUCCESS

在这种情况下,后台处理程序会分配足够大的新缓冲区,然后使用 DOCUMENTEVENT_QUERYFILTER 再次调用 DrvDocumentEvent

如果驱动程序不支持DOCUMENTEVENT_QUERYFILTER事件,它应返回DOCUMENTEVENT_UNSUPPORTED。 如果驱动程序支持DOCUMENTEVENT_QUERYFILTER,但在处理此事件时遇到内部错误,则它应返回DOCUMENTEVENT_FAILURE。 在任一情况下,后台处理程序都无法从驱动程序中检索事件筛选器,因此它会继续调用所有事件的 DrvDocumentEvent 的行为。

要求

要求 价值
标头 winddiui.h (包括 Winddiui.h)

另请参阅

DrvDocumentEvent