Transfert de données entre l’application héritée et le pilote Windows Vista
La couche de compatibilité doit s’assurer que le filtre de traitement d’images du pilote est toujours appelé et qu’une application héritée qui ne prend pas explicitement en charge le compte LocalService sera toujours en mesure d’effectuer un transfert de données. Le compte LocalService est disponible sur Microsoft Windows XP et les systèmes d’exploitation ultérieurs.
Au minimum, un pilote hérité doit exposer à la fois TYMED_FILE et TYMED_CALLBACK ; Toutefois, un pilote Windows Vista n’expose jamais TYMED_CALLBACK (ou TYMED_MULTIPAGE_CALLBACK). La partie transfert de la couche de compatibilité garantit qu’une application héritée verra TYMED_CALLBACK bien que le pilote Windows Vista ne l’implémente pas. TYMED_MULTIPAGE_CALLBACK ne sera jamais exposé à partir d’un pilote Windows Vista.
Une application héritée verra les formats pris en charge pour TYMED_FILE et les TYMED_MULTIPAGE_FILE que le pilote Windows Vista expose. Pour TYMED_CALLBACK, une application héritée verra les mêmes formats que ceux exposés par le pilote pour TYMED_FILE, à une exception près : au lieu d’exposer WiaImgFmt_BMP, la couche de compatibilité exposera WiaImgFmt_MEMORYBMP à l’application héritée. Pour ce faire, la couche de compatibilité « intercepte » les appels à IWiaMiniDrv::d rvGetWiaFormatInfo et ajoute tous les formats de TYMED_FILE du pilote Windows Vista (à l’exception de WiaImgFmt_BMP /WiaImgFmt_MEMORYBMP) pour TYMED_CALLBACK. Plus important encore, la couche de compatibilité crée son propre objet de rappel hérité lors des transferts de données, qui convertit les messages de transfert Windows Vista et les données écrites dans son flux en messages de transfert hérités.
Pour plus d’informations sur les constantes TYMED, consultez Présentation de TYMED.
La couche de compatibilité crée deux objets de rappel dans le proxy COM WIA : l’un pour les transferts de rappel et l’autre pour les transferts de fichiers. Le proxy COM WIA implémente l’interface IWiaTransferCallback. Cet objet de rappel prend en charge la conversion entre le transfert basé sur le flux et le transfert « à l’ancienne ». La couche de compatibilité WIA lance également le filtre de traitement d’image du pilote auquel nous transmettons l’objet de rappel de la couche de compatibilité. Ainsi, le filtre de traitement d’image s’exécute toujours dans le contexte de l’application, comme avec les transferts Windows Vista.
Le diagramme suivant illustre le fonctionnement de la couche de compatibilité avec un pilote Windows Vista et une application héritée.
L’objet de rappel hérité dans le proxy COM WIA convertit les messages de transfert Windows Vista et les données écrites en flux en messages de transfert hérités, et écrit les données dans un fichier ou un rappel de données à bandes.
Lorsque le pilote appelle l’une des méthodes exposées par l’interface IStream qu’il reçoit de la méthode IWiaMiniDrvTransferCallback::GetNextStream (notez qu’un pilote doit uniquement appeler IStream::Write, IStream::Seek et IStream::SetSize). Ainsi, la couche de compatibilité crée une implémentation IStream personnalisée qui encapsule simplement l’interface IStream que le proxy COM WIA fournit.
Les transferts de fichiers hérités sont simples. Un exemple de ce type de transfert est lorsqu’une application héritée appelle IWiaDataTransfer::idtGetData. La couche de compatibilité crée un flux de données sur le fichier spécifié par l’application dans la structure STGMEDIUM. Ce flux est passé au pilote ou au filtre de traitement d’image lorsqu’il appelle IWiaTransferCallback::GetNextStream et que tous les messages de transfert sont facilement mappés aux messages de transfert hérités. Pour obtenir une description plus détaillée de la façon dont les messages sont mappés, consultez Implémentation du transfert de données de la couche de compatibilité WIA.
Lors de l’appel de la méthode IWiaDataTransfer::d tGetData, la couche de compatibilité effectue une vérification des paramètres plus stricte. Par exemple, la couche de compatibilité n’autorise pas l’appel de la méthode IWiaDataTrasnfer::idtGetData avec TYMED_FILE et un nombre de pages supérieur à un dans les transferts de données qui n’utilisent pas la couche de compatibilité, il était possible d’appeler la méthode IWiaDataTrasnfer::idtGetData avec TYMED_FILE et d’avoir un nombre de pages supérieur à un.
Les transferts de rappel hérités sont un peu plus difficiles. Étant donné qu’un pilote Windows Vista ne prend pas en charge WiaImgFmt_MEMORYBMP, ce qui est requis pour les pilotes hérités, l’objet de rappel de la couche de compatibilité doit gérer la conversion de WiaImgFmt_BMP en WiaImgFmt_MEMORYBMP. Le mappage entre les messages de transfert n’est pas non plus très simple. La couche de compatibilité crée sa propre implémentation de flux. La couche de compatibilité envoie IT_MSG_DATA messages au rappel de l’application lors des appels à la méthode IStream::Write par l’application.
Une modification a dû être apportée à l’interface IWiaTransfer dans le cadre de l’implémentation de la couche de compatibilité ; La fonction IWiaTransfer::EnumWIA_FORMAT_INFO est ajoutée à IWiaTransfer pour autoriser les transferts TYMED_MULTIPAGE_FILE. Cet ajout n’est pas une conséquence de la couche de compatibilité, mais il est nécessaire, car il n’est pas possible d’accéder à l’interface IWiaDataTransfer à partir de l’interface IWiaTransfer ou de l’interface IWiaItem2 à l’interface IWiaItem .
Les interfaces IWiaDataTransfer, IWiaTransfer, IWiaItem, IWiaItem2 et IStream, ainsi que la structure STGMEDIUM sont présentées dans la documentation Microsoft Windows SDK.