Méthode IWiaDataCallback ::BandedDataCallback (wia_xp.h)

Fournit des notifications de transfert de données status. Les méthodes de transfert de données WIA (Windows Image Acquisition) de l’interface IWiaDataTransfer appellent régulièrement cette méthode.

Syntaxe

HRESULT BandedDataCallback(
  [in] LONG lMessage,
  [in] LONG lStatus,
  [in] LONG lPercentComplete,
  [in] LONG lOffset,
  [in] LONG lLength,
  [in] LONG lReserved,
  [in] LONG lResLength,
  [in] BYTE *pbBuffer
);

Paramètres

[in] lMessage

Type : LONG

Spécifie une constante qui indique la raison du rappel. Peut avoir l’une des valeurs suivantes :

IT_MSG_DATA

Le système WIA transfère des données à l’application.

IT_MSG_DATA_HEADER

L’application reçoit un en-tête avant de recevoir les données réelles.

IT_MSG_DEVICE_STATUS

Windows Vista ou version ultérieure. L’état de l’appareil a changé.

IT_MSG_FILE_PREVIEW_DATA

Le système WIA transfère les données d’aperçu à l’application.

IT_MSG_FILE_PREVIEW_DATA_HEADER

L’application reçoit un en-tête avant de recevoir les données d’aperçu réelles.

IT_MSG_NEW_PAGE

Le transfert de données commence une nouvelle page.

IT_MSG_STATUS

Cet appel du rappel envoie uniquement des informations status.

IT_MSG_TERMINATION

Le transfert de données est terminé.

[in] lStatus

Type : LONG

Spécifie une constante qui indique la status de l’appareil WIA. Peut être défini sur une combinaison des éléments suivants :

IT_STATUS_TRANSFER_FROM_DEVICE

Les données sont en cours de transfert à partir de l’appareil WIA.

IT_STATUS_PROCESSING_DATA

Les données sont en cours de traitement.

IT_STATUS_TRANSFER_TO_CLIENT

Les données sont en cours de transfert vers la mémoire tampon de données du client.

[in] lPercentComplete

Type : LONG

Spécifie le pourcentage de données totales qui ont été transférées jusqu’à présent.

[in] lOffset

Type : LONG

Spécifie un décalage, en octets, à partir du début de la mémoire tampon où commence la bande de données actuelle.

[in] lLength

Type : LONG

Spécifie la longueur, en octets, de la bande de données actuelle.

[in] lReserved

Type : LONG

Réservé à une utilisation interne par le système d’exécution WIA.

[in] lResLength

Type : LONG

Réservé à une utilisation interne par le système d’exécution WIA.

[in] pbBuffer

Type : BYTE*

Pointeur vers le tampon de données.

Valeur retournée

Type : HRESULT

Si la méthode réussit, la méthode retourne S_OK. Pour annuler le transfert de données, il retourne S_FALSE. Si la méthode échoue, elle retourne un code d’erreur COM standard.

Remarques

Votre application doit fournir la méthode IWiaDataCallback ::BandedDataCallback . Cette méthode est régulièrement appelée par les méthodes de transfert de données de l’interface IWiaDataTransfer . Il fournit status messages à l’application pendant le transfert de données. En retournant S_FALSE, votre programme peut également utiliser cette méthode pour arrêter prématurément le transfert de données.

Lorsque cette méthode est appelée, le paramètre lMessage contient la raison de l’appel. Tous les paramètres ne contiennent pas de données sur tous les appels. Par exemple, lorsque IWiaDataCallback ::BandedDataCallback est appelé avec un message de IT_MSG_TERMINATION, il ne doit pas tenter d’utiliser les valeurs dans les paramètres pbBuffer, lOffset et lLength .

Si la valeur de lMessage est IT_MSG_DATA, la mémoire tampon pointée par pbBuffer contient une bande de données d’image. Le paramètre lOffset contient un décalage en octets par rapport au début de la mémoire tampon où commence la bande de données actuelle. Le paramètre lLength a spécifié la longueur en octets de la bande de données actuelle.

Pendant les appels où lMessage est défini sur IT_MSG_DATA ou IT_MSG_STATUS, le paramètre lStatus contient une valeur valide. Son contenu ne doit pas être utilisé lorsque lMessage contient d’autres valeurs.

Si lMessage est IT_MSG_DATA_HEADER, le paramètre pbBuffer pointe vers une structure WIA_DATA_CALLBACK_HEADER .

Lorsqu’une erreur s’est produite lors d’un transfert de données d’image, le pilote définit lMessage sur IT_MSG_DEVICE_STATUS. L’objet de rappel proxy appelle ReportStatus, qui gère l’erreur et affiche les messages à l’utilisateur.

Exemples

L’exemple suivant montre une façon possible d’implémenter la méthode IWiaDataCallback ::BandedDataCallback .

L’exemple de code d’application définit l’objet CDataCallback qu’il dérive de l’interface IWiaDataCallback . L’application doit instancier un objet CDataCallback . Il appelle ensuite CDataCallback ::QueryInterface pour obtenir un pointeur d’interface IWiaDataCallback . Lorsque l’application est prête à recevoir des données, elle appelle la méthode idtGetBandedData et transmet à la méthode un pointeur vers l’interface IWiaDataCallback .

Régulièrement, la méthode idtGetBandedData utilise le pointeur d’interface IWiaDataCallback pour appeler la méthode CDataCallback ::BandedDataCallback de l’application. Les premiers appels envoient des messages status. Ils sont suivis d’un appel qui transfère un en-tête de données à la méthode de rappel. Une fois que l’application a reçu l’en-tête de données, idtGetBandedData appelle CDataCallback ::BandedDataCallback pour transférer des données vers l’application. Une fois le transfert de données terminé, il appelle la méthode de rappel une dernière fois pour transmettre un message d’arrêt.


//
// The application must instantiate the CDataCallback object using
// the "new" operator, and call QueryInterface to retrieve the 
// IWiaDataCallback interface.
//
// In this example, using in-memory transfer, the application then
// calls the IWiaDataTransfer::idtGetBandedData method and passes
// it the IWiaDataCallback interface pointer.
//
// If the application performs a file transfer using
// IWiaDataTransfer::idtGetData, only status messages are sent,
// and the data is transferred in a file.
//
class CDataCallback : public IWiaDataCallback
{
private:
    LONG  m_cRef;               // Object reference count 
    PBYTE m_pBuffer;            // Data buffer
    LONG  m_nBufferLength;      // Length of buffer
    LONG  m_nBytesTransfered;   // Total number of bytes transferred
    GUID  m_guidFormat;         // Data format

public:
    
    //
    // Constructor and destructor
    //
    CDataCallback()
      : m_cRef(1),
        m_pBuffer(NULL),
        m_nBufferLength(0),
        m_nBytesTransfered(0),
        m_guidFormat(IID_NULL)
    {
    }
    ~CDataCallback()
    {
        //
        // Free the item buffer
        //
        if (m_pBuffer)
        {
            LocalFree( m_pBuffer );
            m_pBuffer = NULL;
        }
        m_nBufferLength = 0;
        m_nBytesTransfered = 0;
    }

    //
    // IUnknown methods
    //
    HRESULT CALLBACK QueryInterface( REFIID riid, void **ppvObject )
    {
        //
        // Validate arguments
        //
        if (NULL == ppvObject)
        {
            return E_INVALIDARG;
        }

        //
        // Return the appropriate interface
        //
        if (IsEqualIID( riid, IID_IUnknown ))
        {
            *ppvObject = static_cast<CDataCallback *>(this);
        }
        else if (IsEqualIID( riid, IID_IWiaDataCallback ))
        {
            *ppvObject = static_cast<CDataCallback *>(this);
        }
        else
        {
            *ppvObject = NULL;
            return(E_NOINTERFACE);
        }

        //
        // Increment the reference count before returning the interface.
        //
        reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
        return S_OK;
    }
    ULONG CALLBACK AddRef()
    {
        return InterlockedIncrement(&m_cRef);
    }    
    ULONG CALLBACK Release()
    {
        LONG cRef = InterlockedDecrement(&m_cRef);
        if (0 == cRef)
        {
            delete this;
        }
        return cRef;
    }

    //
    // The IWiaDataTransfer::idtGetBandedData method periodically 
    // calls the IWiaDataCallback::BandedDataCallback method with
    // status messages. It sends the callback method a data header
    // message followed by one or more data messages to transfer 
    // data. It concludes by sending a termination message.
    //
    
    HRESULT _stdcall BandedDataCallback(
            LONG lMessage,
            LONG lStatus,
            LONG lPercentComplete,
            LONG lOffset,
            LONG lLength,
            LONG lReserved,
            LONG lResLength,
            BYTE *pbData)
    {
        UNREFERENCED_PARAMETER(lReserved);
        UNREFERENCED_PARAMETER(lResLength);
        switch (lMessage)
        {
        case IT_MSG_DATA_HEADER:
            {
                //
                // The data header contains the image's final size.
                //
                PWIA_DATA_CALLBACK_HEADER pHeader = reinterpret_cast(pbData);
                if (pHeader && pHeader->lBufferSize)
                {
                    //
                    // Allocate a block of memory to hold the image
                    //
                    m_pBuffer = reinterpret_cast(LocalAlloc(LPTR,pHeader->lBufferSize));
                    if (m_pBuffer)
                    {
                        //
                        // Save the buffer size.
                        //
                        m_nBufferLength = pHeader->lBufferSize;

                        //
                        // Initialize the bytes transferred count.
                        //
                        m_nBytesTransfered = 0;

                        //
                        // Save the file format.
                        //
                        m_guidFormat = pHeader->guidFormatID;
                    }
                }
            }
            break;

        case IT_MSG_DATA:
            {
                //
                // Make sure a block of memory has been created.
                //
                if (NULL != m_pBuffer)
                {
                    //
                    // Copy the new band.
                    //
                    CopyMemory( m_pBuffer + lOffset, pbData, lLength );

                    //
                    // Increment the byte count.
                    //
                    m_nBytesTransfered += lLength;
                }
            }
            break;

        case IT_MSG_STATUS:
            {
                //
                // Display transfer phase
                //
                if (lStatus & IT_STATUS_TRANSFER_FROM_DEVICE)
                {
                    _tprintf(TEXT("Transfer from device\n"));
                }
                else if (lStatus & IT_STATUS_PROCESSING_DATA)
                {
                    _tprintf(TEXT("Processing Data\n"));
                }
                else if (lStatus & IT_STATUS_TRANSFER_TO_CLIENT)
                {
                    _tprintf(TEXT("Transfer to Client\n"));
                }

                //
                // Display percent complete
                //
                _tprintf( TEXT("lPercentComplete: %d\n"), lPercentComplete );
            }
            break;
        }

        return S_OK;
    }
};

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel, Windows XP [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau uniquement]
Plateforme cible Windows
En-tête wia_xp.h (incluez Wia.h)
Bibliothèque Wiaguid.lib