Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 TYMED_MULTIPAGE_FILE que le pilote Windows Vista expose. Pour TYMED_CALLBACK, une application héritée voit les mêmes formats que le pilote expose pour TYMED_FILE, à une exception près : au lieu d’exposer WiaImgFmt_BMP, la couche de compatibilité expose WiaImgFmt_MEMORYBMP à l’application héritée. Pour ce faire, la couche de compatibilité doit intercepter les appels à IWiaMiniDrv::drvGetWiaFormatInfo, et ajouter tous les formats TYMED_FILE du pilote Windows Vista (à l'exception de WiaImgFmt_BMP et WiaImgFmt_MEMORYBMP) pour le TYMED_CALLBACK. Plus important encore, la couche de compatibilité crée son propre objet de rappel hérité pendant les 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 : un pour les transferts de rappel et un pour les transferts de fichiers. Le proxy COM WIA implémente l’interface IWiaTransferCallback. Cet objet callback s’occupe de la conversion entre le transfert basé sur le flux et le transfert traditionnel. La couche de compatibilité WIA lance également le filtre de traitement d’images du pilote auquel nous transmettons l’objet de rappel de la couche de compatibilité. Par conséquent, le filtre de traitement d’images 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 dans un rappel de données en 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 tel 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 transmis au pilote ou au filtre de traitement d'images lors de l'appel de IWiaTransferCallback::GetNextStream et 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 l’implémentation du transfert de données de couche de compatibilité WIA.
Lors de l’appel à la méthode IWiaDataTransfer ::d tGetData, la couche de compatibilité effectue une vérification de paramètre plus stricte. Par exemple, la couche de compatibilité n’autorise pas l’appel de la méthode IWiaDataTransfer::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 IWiaDataTransfer::idtGetData avec TYMED_FILE et d’avoir un nombre de pages supérieur à un.
Les transferts de rappel anciens sont légèrement plus complexes. É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 des messages IT_MSG_DATA au callback de l'application lorsque celle-ci appelle la méthode IStream::Write.
Une modification devait ê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 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 et la structure STGMEDIUM sont abordées dans la documentation du Kit de développement logiciel (SDK) Microsoft Windows.