estrutura DOCEVENT_FILTER (winddiui.h)

A estrutura DOCEVENT_FILTER contém uma lista de eventos de documento aos quais o driver da impressora responderá. Consulte DrvDocumentEvent para obter uma lista completa dos eventos do documento.

Sintaxe

typedef struct _DOCEVENT_FILTER {
  UINT  cbSize;
  UINT  cElementsAllocated;
  UINT  cElementsNeeded;
  UINT  cElementsReturned;
  DWORD aDocEventCall[ANYSIZE_ARRAY];
} DOCEVENT_FILTER, *PDOCEVENT_FILTER;

Membros

cbSize

Tamanho fornecido pelo spooler, em bytes, dessa estrutura. O spooler inicializa esse membro para sizeof(DOCEVENT_FILTER).

cElementsAllocated

Número de elementos fornecidos pelo spooler no membro da matriz aDocEventCall . O spooler inicializa esse membro para DOCUMENTEVENT_LAST - 1. (A constante DOCUMENTEVENT_LAST é definida no arquivo de cabeçalho Winddiui.h.)

cElementsNeeded

Número total de elementos necessários no membro da matriz aDocEventCall fornecido pelo driver. O spooler inicializa esse membro para 0XFFFFFFFF. Para obter mais informações, consulte a seção Comentários a seguir.

cElementsReturned

Número fornecido pelo driver de eventos DOCUMENTEVENT_**XXX **que ele colocou no membro da matriz aDocEventCall . O spooler inicializa esse membro para 0XFFFFFFFF. Para obter mais informações, consulte a seção Comentários a seguir.

aDocEventCall[ANYSIZE_ARRAY]

Matriz de DWORDs preenchida pelo driver listando todos os eventos DOCUMENTEVENT_XXX aos quais o driver da impressora responderá. O spooler inicializa esse membro como 0.

Comentários

O driver da impressora lista os eventos aos quais ele responderá na estrutura DOCEVENT_FILTER. Como isso limita o número de chamadas para o driver que o spooler precisa fazer, o desempenho da impressora é aprimorado. Quando o spooler faz uma chamada para o DDI DrvDocumentEvent com seu parâmetro iEsc definido como DOCUMENTEVENT_QUERYFILTER, o spooler aloca um buffer que contém uma estrutura DOCEVENT_FILTER, incluindo sua matriz aDocEventCall . A quantidade de memória alocada para o buffer é:

sizeof(DOCEVENT_FILTER) + sizeof(DWORD) * (DOCUMENTEVENT_LAST - 2)

Depois de alocar um buffer que contém uma estrutura DOCEVENT_FILTER, o spooler inicializa os membros da estrutura com os seguintes valores:

Membro Inicializado para
cbSize 0
cElementsAllocated DOCUMENTEVENT_LAST - 1

A constante DOCUMENTEVENT_LAST é definida em winddiui.h.
cElementsNeeded 0XFFFFFFFF
cElementsReturned 0XFFFFFFFF
aDocEventCall 0

Depois que o spooler inicializar os membros da estrutura para os valores mostrados na tabela anterior, ele chamará DrvDocumentEvent. Quando essa função retorna, o spooler inspeciona os membros cElementsNeeded e cElementsReturned para ver se algum deles foi alterado. Se o driver tiver gravado em um desses membros, mas não no outro, o spooler interpretará o membro não escrito como tendo o valor 0.

Se o driver der suporte a DOCUMENTEVENT_QUERYFILTER:

  • Se a matriz aDocEventCall for grande o suficiente para conter todos os eventos DOCUMENTEVENT_XXX que o driver da impressora pretende colocar nele, o driver da impressora:

    • Preenche a matriz com esses eventos

    • Define o membro cElementsReturned para esse número de eventos (que devem ser menores ou iguais a cElementsAllocated)

    • Deixa cElementsNeeded inalterado

    • Retorna DOCUMENTEVENT_SUCCESS

Nesse caso, o spooler usa os primeiros valores cElementsReturned na matriz aDocEventCall .

O evento DOCUMENTEVENT_CREATEDCPRE é tratado de maneira especial. Quando o spooler chama DrvDocumentEvent com o parâmetro iEsc definido como DOCUMENTEVENT_CREATEDCPRE, o spooler usa o valor retornado para determinar se chamadas futuras para essa função são necessárias. Ao contrário de outros eventos DOCUMENTEVENT_XXX , o driver de impressora sempre recebe chamadas para DrvDocumentEvent com DOCUMENTEVENT_CREATEDCPRE, independentemente de esse evento ser filtrado ou não.

  • Se a matriz aDocEventCall não for grande o suficiente para conter todos os eventos DOCUMENTEVENT_XXX que o driver da impressora pretende colocar nele, o driver da impressora deverá:

    • Defina cElementsNeeded como o número de eventos aos quais ele pretende responder (que deve ser maior que cElementsAllocated)

    • Deixar cElementsReturned inalterado

    • Retornar DOCUMENTEVENT_SUCCESS

Nesse caso, o spooler aloca um novo buffer suficientemente grande e, em seguida, faz outra chamada para DrvDocumentEvent com DOCUMENTEVENT_QUERYFILTER.

Se o driver não der suporte ao evento DOCUMENTEVENT_QUERYFILTER, ele deverá retornar DOCUMENTEVENT_UNSUPPORTED. Se o driver der suporte a DOCUMENTEVENT_QUERYFILTER, mas encontrar erros internos ao manipular esse evento, ele deverá retornar DOCUMENTEVENT_FAILURE. Em ambos os casos, o spooler não é capaz de recuperar o filtro de eventos do driver, portanto, ele continua em seu comportamento de chamar DrvDocumentEvent para todos os eventos.

Requisitos

Requisito Valor
Cabeçalho winddiui.h (inclua Winddiui.h)

Confira também

DrvDocumentEvent