struttura DOCEVENT_FILTER (winddiui.h)

La struttura DOCEVENT_FILTER contiene un elenco di eventi del documento a cui risponderà il driver della stampante. Per un elenco completo degli eventi del documento, vedere DrvDocumentEvent .

Sintassi

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

Members

cbSize

Dimensioni fornite da Spooler, in byte, di questa struttura. Il spooler inizializza questo membro a sizeof(DOCEVENT_FILTER).

cElementsAllocated

Numero di elementi fornito da Spooler nel membro matrice aDocEventCall . Il spooler inizializza questo membro in DOCUMENTEVENT_LAST - 1. La costante DOCUMENTEVENT_LAST è definita nel file di intestazione Winddiui.h.)

cElementsNeeded

Numero totale fornito dal driver di elementi necessari nel membro matrice aDocEventCall . Il spooler inizializza questo membro in 0XFFFFFFFF. Per ulteriori informazioni, vedere la sezione Osservazioni successiva.

cElementsReturned

Numero fornito dal driver di DOCUMENTEVENT_**XXX **eventi inseriti nel membro matrice aDocEventCall . Il spooler inizializza questo membro in 0XFFFFFFFF. Per ulteriori informazioni, vedere la sezione Osservazioni successiva.

aDocEventCall[ANYSIZE_ARRAY]

Matrice compilata con driver di DWORD che elenca tutti gli eventi DOCUMENTEVENT_ XXX a cui risponderà il driver della stampante. Il spooler inizializza questo membro su 0.

Commenti

Il driver della stampante elenca gli eventi a cui risponderà nella struttura DOCEVENT_FILTER. Poiché questo limita il numero di chiamate al driver che il spooler deve eseguire, le prestazioni della stampante sono migliorate. Quando lo spooler effettua una chiamata al DDI DrvDocumentEvent con il relativo parametro iEsc impostato su DOCUMENTEVENT_QUERYFILTER, lo spooler alloca un buffer che contiene una struttura DOCEVENT_FILTER, inclusa la matrice aDocEventCall . La quantità di memoria allocata per il buffer è:

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

Dopo aver allocato un buffer contenente una struttura di DOCEVENT_FILTER, lo spooler inizializza i membri della struttura ai valori seguenti:

Membro Inizializzato in
cbSize 0
cElementsAllocated DOCUMENTEVENT_LAST - 1

La costante DOCUMENTEVENT_LAST è definita in winddiui.h.
cElementsNeeded 0XFFFFFFFF
cElementsReturned 0XFFFFFFFF
aDocEventCall 0

Dopo che lo spooler ha inizializzato i membri della struttura ai valori visualizzati nella tabella precedente, quindi chiama DrvDocumentEvent. Quando questa funzione restituisce, lo spooler controlla i membri cElementsNeeded e cElementsReturned per verificare se è stata modificata una delle due funzioni. Se il driver ha scritto in uno di questi membri, ma non l'altro, lo spooler interpreta il membro non scritto come con il valore 0.

Se il driver supporta DOCUMENTEVENT_QUERYFILTER:

  • Se la matrice aDocEventCall è sufficiente per contenere tutti gli eventi DOCUMENTEVENT_ XXX, il driver della stampante intende inserirlo, il driver della stampante:

    • Riempie la matrice con tali eventi

    • Imposta il membro cElementsReturned su tale numero di eventi (che deve essere minore o uguale a cElementsAllocated)

    • Foglie cElementsNeed invariate

    • Restituisce DOCUMENTEVENT_SUCCESS

In questo caso, lo spooler usa i primi valori cElementsReturned nella matrice aDocEventCall .

L'evento DOCUMENTEVENT_CREATEDCPRE viene trattato in modo speciale. Quando il spooler chiama DrvDocumentEvent con il parametro iEsc impostato su DOCUMENTEVENT_CREATEDCPRE, lo spooler usa il valore restituito per determinare se sono necessarie chiamate future a questa funzione. A differenza di altri eventi DOCUMENTEVENT_XXX , il driver della stampante riceve sempre chiamate a DrvDocumentEvent con DOCUMENTEVENT_CREATEDCPRE, indipendentemente dal fatto che questo evento venga filtrato o meno.

  • Se la matrice aDocEventCall non è sufficiente per contenere tutti gli eventi DOCUMENTEVENT_ XXX, il driver della stampante intende inserirlo, il driver della stampante deve:

    • Impostare cElementsNeeded sul numero di eventi a cui intende rispondere (che deve essere maggiore di cElementsAllocated)

    • Lasciare invariato cElementsReturned

    • Restituire DOCUMENTEVENT_SUCCESS

In questo caso, lo spooler alloca quindi un nuovo buffer sufficientemente grande e quindi effettua un'altra chiamata a DrvDocumentEvent con DOCUMENTEVENT_QUERYFILTER.

Se il driver non supporta l'evento DOCUMENTEVENT_QUERYFILTER, deve restituire DOCUMENTEVENT_UNSUPPORTED. Se il driver supporta DOCUMENTEVENT_QUERYFILTER, ma rileva errori interni quando gestisce questo evento, deve restituire DOCUMENTEVENT_FAILURE. In entrambi i casi, lo spooler non è in grado di recuperare il filtro evento dal driver, quindi continua nel comportamento di chiamare DrvDocumentEvent per tutti gli eventi.

Requisiti

Requisito Valore
Intestazione winddiui.h (include Winddiui.h)

Vedi anche

DrvDocumentEvent