Transferencia de datos entre la aplicación heredada y el controlador de Windows Vista
La capa de compatibilidad debe asegurarse de que el filtro de procesamiento de imágenes del controlador siempre se invoque y que una aplicación heredada que no admita explícitamente la cuenta localService seguirá siendo capaz de realizar una transferencia de datos. La cuenta localService está disponible en Microsoft Windows XP y en sistemas operativos posteriores.
Como mínimo, un controlador heredado debe exponer tanto TYMED_FILE como TYMED_CALLBACK; sin embargo, un controlador de Windows Vista nunca expondrá TYMED_CALLBACK (o TYMED_MULTIPAGE_CALLBACK). La parte de transferencia de la capa de compatibilidad se asegurará de que una aplicación heredada verá TYMED_CALLBACK aunque el controlador de Windows Vista no lo implemente. TYMED_MULTIPAGE_CALLBACK nunca se expondrá desde un controlador de Windows Vista.
Una aplicación heredada verá los formatos admitidos para TYMED_FILE y TYMED_MULTIPAGE_FILE que expone el controlador de Windows Vista. Para TYMED_CALLBACK, una aplicación heredada verá los mismos formatos que expone el controlador para TYMED_FILE, con una excepción: en lugar de exponer WiaImgFmt_BMP, la capa de compatibilidad expondrá WiaImgFmt_MEMORYBMP a la aplicación heredada. La manera en que esto se hace es tener las llamadas de la capa de compatibilidad "intercept" a IWiaMiniDrv::d rvGetWiaFormatInfo y agregar todos los formatos de TYMED_FILE del controlador de Windows Vista (con la excepción de WiaImgFmt_BMP WiaImgFmt_MEMORYBMP /) para TYMED_CALLBACK. Lo más importante es que la capa de compatibilidad crea su propio objeto de devolución de llamada heredado durante las transferencias de datos, lo que convierte los mensajes de transferencia de Windows Vista y los datos escritos en su flujo en mensajes de transferencia heredados.
Para obtener más información sobre las constantes TYMED, consulte Descripción de TYMED.
La capa de compatibilidad crea dos objetos de devolución de llamada en el proxy COM de WIA: uno para las transferencias de devolución de llamada y otro para las transferencias de archivos. El proxy COM de WIA implementa la interfaz IWiaTransferCallback. Este objeto de devolución de llamada se encarga de la conversión entre la transferencia basada en secuencias y la transferencia de "estilo antiguo". La capa de compatibilidad de WIA también inicia el filtro de procesamiento de imágenes del controlador al que pasamos el objeto de devolución de llamada de la capa de compatibilidad. Por lo tanto, el filtro de procesamiento de imágenes siempre se ejecutará en el contexto de la aplicación igual que con las transferencias de Windows Vista.
En el diagrama siguiente se muestra cómo funcionaría la capa de compatibilidad con un controlador de Windows Vista y una aplicación heredada.
El objeto de devolución de llamada heredado dentro del proxy COM de WIA convierte los mensajes de transferencia de Windows Vista y los datos escritos en streaming en mensajes de transferencia heredados y escribe datos en la devolución de llamada de datos agrupados o archivos.
Cuando el controlador llama a cualquiera de los métodos expuestos por la interfaz IStream que recibe del método IWiaMiniDrvTransferCallback::GetNextStream (tenga en cuenta que un controlador solo debe llamar a IStream::Write, IStream::Seek e IStream::SetSize). Por lo tanto, la capa de compatibilidad crea una implementación personalizada de IStream que simplemente encapsula la interfaz IStream que proporciona el proxy COM de WIA.
Las transferencias de archivos heredadas son sencillas. Un ejemplo de dicha transferencia es cuando una aplicación heredada llama a IWiaDataTransfer::idtGetData. La capa de compatibilidad crea un flujo de datos en el archivo que la aplicación especifica en la estructura STGMEDIUM. Esta secuencia se pasa al controlador o al filtro de procesamiento de imágenes cuando llama a IWiaTransferCallback::GetNextStream y todos los mensajes de transferencia se asignan fácilmente a los mensajes de transferencia heredados. Para obtener una descripción más detallada de cómo se asignan los mensajes, consulte Implementación de transferencia de datos de la capa de compatibilidad wia.
Al llamar al método IWiaDataTransfer::d tGetData, la capa de compatibilidad realiza alguna comprobación de parámetros más estricta. Por ejemplo, la capa de compatibilidad no permite llamar al método IWiaDataTrasnfer::idtGetData con TYMED_FILE y un recuento de páginas superior y, a continuación, una transferencia de datos In que no utiliza la capa de compatibilidad, era posible llamar al método IWiaDataTrasnfer::idtGetData con TYMED_FILE y tener un recuento de páginas mayor a continuación.
Las transferencias de devolución de llamada heredadas son un poco más complicadas. Dado que un controlador de Windows Vista no admite WiaImgFmt_MEMORYBMP, que es necesario para los controladores heredados, el objeto de devolución de llamada de la capa de compatibilidad debe controlar la conversión de WiaImgFmt_BMP a WiaImgFmt_MEMORYBMP. La asignación entre mensajes de transferencia tampoco es bastante sencilla. La capa de compatibilidad crea su propia implementación de flujo. La capa de compatibilidad envía IT_MSG_DATA mensajes a la devolución de llamada de la aplicación tras las llamadas al método IStream::Write por la aplicación.
Se tuvo que realizar un cambio en la interfaz IWiaTransfer como parte de la implementación de la capa de compatibilidad; La función IWiaTransfer::EnumWIA_FORMAT_INFO se agrega a IWiaTransfer para permitir transferencias TYMED_MULTIPAGE_FILE. Esta adición no es una consecuencia de la capa de compatibilidad, pero es necesario porque no es posible llegar a la interfaz IWiaDataTransfer desde la interfaz IWiaTransfer o desde la interfaz IWiaItem2 a la interfaz IWiaItem.
Las interfaces IWiaDataTransfer, IWiaTransfer, IWiaItem, IWiaItem2 e IStream y la estructura STGMEDIUM se describen en la documentación de Microsoft Windows SDK.