Condividi tramite


Trasferimento dei dati tra l'applicazione legacy e il driver Windows Vista

Il livello di compatibilità deve assicurarsi che il filtro di elaborazione delle immagini del driver venga sempre richiamato e che un'applicazione legacy che non supporta in modo esplicito l'account LocalService sarà comunque in grado di eseguire un trasferimento dati. L'account LocalService è disponibile in Microsoft Windows XP e nei sistemi operativi successivi.

Almeno, un driver legacy deve esporre sia TYMED_FILE che TYMED_CALLBACK; tuttavia, un driver Windows Vista non espone mai TYMED_CALLBACK (o TYMED_MULTIPAGE_CALLBACK). La parte di trasferimento del livello di compatibilità assicurerà che un'applicazione legacy visualizzerà TYMED_CALLBACK anche se il driver windows Vista non lo implementa. TYMED_MULTIPAGE_CALLBACK non verrà mai esposto da un driver Di Windows Vista.

Un'applicazione legacy visualizzerà i formati supportati per TYMED_FILE e TYMED_MULTIPAGE_FILE che il driver Windows Vista espone. Per TYMED_CALLBACK, un'applicazione legacy visualizzerà gli stessi formati del driver esposti per TYMED_FILE, con un'eccezione: invece di esporre WiaImgFmt_BMP, il livello di compatibilità espongono WiaImgFmt_MEMORYBMP all'applicazione legacy. Il modo in cui viene eseguita questa operazione consiste nell'avere le chiamate del livello di compatibilità "intercetta" a IWiaMiniDrv::d rvGetWiaFormatInfo e aggiungere tutti i formati di TYMED_FILE del driver Windows Vista (ad eccezione di WiaImgFmt_BMP WiaImgFmt_MEMORYBMP) per TYMED_CALLBACK /. In particolare, il livello di compatibilità crea il proprio oggetto callback legacy durante i trasferimenti di dati, che converte i messaggi di trasferimento e i dati di Windows Vista scritti nel flusso nei messaggi di trasferimento legacy.

Per altre informazioni sulle costanti TYMED, vedere Informazioni su TYMED.

Il livello di compatibilità crea due oggetti callback nel proxy COM WIA: uno per i trasferimenti di callback e uno per i trasferimenti di file. Il proxy WIA COM implementa l'interfaccia IWiaTransferCallback. Questo oggetto callback si occupa della conversione tra il trasferimento basato su flusso e il trasferimento "old-style". Il livello di compatibilità WIA avvia anche il filtro di elaborazione delle immagini del driver a cui viene passato l'oggetto callback del livello di compatibilità. Pertanto, il filtro di elaborazione delle immagini verrà sempre eseguito nel contesto dell'applicazione come con i trasferimenti di Windows Vista.

Il diagramma seguente illustra il funzionamento del livello di compatibilità con un driver Windows Vista e un'applicazione legacy.

diagramma che illustra il trasferimento dei dati tra un'applicazione legacy e un driver windows vista.

L'oggetto callback legacy all'interno del proxy COM WIA converte i messaggi di trasferimento e i dati di Windows Vista scritti in flusso nei messaggi di trasferimento legacy e scrive i dati nel callback di dati a file o a banda.

Quando il driver chiama uno dei metodi esposti dall'interfaccia IStream che riceve dal metodo IWiaMiniDrvTransferCallback::GetNextStream (si noti che un driver deve chiamare solo IStream::Write, IStream: :Seek e IStream:: SetSize). Pertanto, il livello di compatibilità crea un'implementazione IStream personalizzata che esegue semplicemente il wrapping dell'interfaccia IStream fornita dal proxy COM WIA.

I trasferimenti di file legacy sono semplici. Un esempio di trasferimento è quando un'applicazione legacy chiama IWiaDataTransfer::idtGetDataData. Il livello di compatibilità crea un flusso di dati nel file specificato dall'applicazione nella struttura STGMEDIUM. Questo flusso viene passato al filtro di elaborazione driver o immagine quando chiama IWiaTransferCallback::GetNextStream e tutti i messaggi di trasferimento vengono facilmente mappati ai messaggi di trasferimento legacy. Per una descrizione più dettagliata del mapping dei messaggi, vedere Implementazione del trasferimento dei dati livello di compatibilità WIA.

Quando si chiama il metodo IWiaDataTransfer::d tGetData, il livello di compatibilità esegue un controllo dei parametri più restrittivo. Ad esempio, il livello di compatibilità non consente di chiamare il metodo IWiaDataTrasnfer::idtGetData con TYMED_FILE e un conteggio di pagine superiore, quindi uno Nei trasferimenti di dati che non utilizzano il livello di compatibilità è stato possibile chiamare il metodo IWiaDataTrasnfer::idtGetData con TYMED_FILE e avere un conteggio di pagine più grande quindi uno.

I trasferimenti di callback legacy sono un po'più complicati. Poiché un driver windows Vista non supporta WiaImgFmt_MEMORYBMP, che è necessario per i driver legacy, l'oggetto callback del livello di compatibilità deve gestire la conversione da WiaImgFmt_BMP a WiaImgFmt_MEMORYBMP. Il mapping tra i messaggi di trasferimento non è anche abbastanza semplice. Il livello di compatibilità crea la propria implementazione del flusso. Il livello di compatibilità invia messaggi IT_MSG_DATA al callback dell'applicazione dopo le chiamate al metodo IStream::Write dall'applicazione.

È necessario apportare una modifica all'interfaccia IWiaTransfer come parte dell'implementazione del livello di compatibilità; La funzione IWiaTransfer::EnumWIA_FORMAT_INFO viene aggiunta a IWiaTransfer per consentire TYMED_MULTIPAGE_FILE trasferimenti. Questa aggiunta non è una conseguenza del livello di compatibilità, ma è necessario perché non è possibile accedere all'interfaccia IWiaDataTransfer dall'interfaccia IWiaTransfer o dall'interfaccia IWiaItem2 all'interfaccia IWiaItem .

Le interfacce IWiaDataTransfer, IWiaTransfer, IWiaItem,IWiaItem2 e IStream e la struttura STGMEDIUM sono illustrate nella documentazione di Microsoft Windows SDK.

IWiaMiniDrvTransferCallback