IWiaDataCallback::BandedDataCallback-Methode (wia_xp.h)

Stellt Datenübertragung status Benachrichtigungen bereit. Windows Image Acquisition (WIA)-Datenübertragungsmethoden der IWiaDataTransfer-Schnittstelle rufen diese Methode regelmäßig auf.

Syntax

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
);

Parameter

[in] lMessage

Typ: LONG

Gibt eine Konstante an, die den Grund für den Rückruf angibt. Folgenden Werte sind möglich:

IT_MSG_DATA

Das WIA-System überträgt Daten an die Anwendung.

IT_MSG_DATA_HEADER

Die Anwendung empfängt vor dem Empfang der tatsächlichen Daten einen Header.

IT_MSG_DEVICE_STATUS

Windows Vista oder höher. Der Status auf dem Gerät wurde geändert.

IT_MSG_FILE_PREVIEW_DATA

Das WIA-System überträgt Vorschaudaten an die Anwendung.

IT_MSG_FILE_PREVIEW_DATA_HEADER

Die Anwendung empfängt einen Header, bevor die tatsächlichen Vorschaudaten empfangen werden.

IT_MSG_NEW_PAGE

Die Datenübertragung beginnt eine neue Seite.

IT_MSG_STATUS

Dieser Aufruf des Rückrufs sendet nur status Informationen.

IT_MSG_TERMINATION

Die Datenübertragung ist abgeschlossen.

[in] lStatus

Typ: LONG

Gibt eine Konstante an, die die status des WIA-Geräts angibt. Kann auf eine Kombination aus folgendem festgelegt werden:

IT_STATUS_TRANSFER_FROM_DEVICE

Derzeit werden Daten vom WIA-Gerät übertragen.

IT_STATUS_PROCESSING_DATA

Die Daten werden derzeit verarbeitet.

IT_STATUS_TRANSFER_TO_CLIENT

Daten werden derzeit in den Datenpuffer des Clients übertragen.

[in] lPercentComplete

Typ: LONG

Gibt den Prozentsatz der bisher übertragenen Gesamtdaten an.

[in] lOffset

Typ: LONG

Gibt einen Offset in Bytes vom Anfang des Puffers an, an dem das aktuelle Datenband beginnt.

[in] lLength

Typ: LONG

Gibt die Länge des aktuellen Datenbands in Bytes an.

[in] lReserved

Typ: LONG

Reserviert für die interne Verwendung durch das WIA-Laufzeitsystem.

[in] lResLength

Typ: LONG

Reserviert für die interne Verwendung durch das WIA-Laufzeitsystem.

[in] pbBuffer

Typ: BYTE*

Zeiger auf den Datenpuffer.

Rückgabewert

Typ: HRESULT

Wenn die Methode erfolgreich ist, gibt die Methode S_OK zurück. Um die Datenübertragung abzubrechen, wird S_FALSE zurückgegeben. Wenn die Methode fehlschlägt, wird ein COM-Standardfehlercode zurückgegeben.

Hinweise

Ihre Anwendung muss die IWiaDataCallback::BandedDataCallback-Methode bereitstellen. Diese Methode wird regelmäßig von den Datenübertragungsmethoden der IWiaDataTransfer-Schnittstelle aufgerufen. Es stellt status Nachrichten an die Anwendung während der Datenübertragung bereit. Wenn Sie S_FALSE zurückgeben, kann Ihr Programm diese Methode auch verwenden, um die Datenübertragung vorzeitig zu beenden.

Wenn diese Methode aufgerufen wird, enthält der lMessage-Parameter den Grund für den Aufruf. Nicht alle Parameter enthalten Daten zu allen Aufrufen. Wenn beispielsweise IWiaDataCallback::BandedDataCallback mit einer Meldung von IT_MSG_TERMINATION aufgerufen wird, sollte nicht versucht werden, die Werte in den Parametern pbBuffer, lOffset und lLength zu verwenden.

Wenn der Wert von lMessage IT_MSG_DATA ist, enthält der Puffer, auf den pbBuffer verweist, ein Band von Bilddaten. Der lOffset-Parameter enthält einen Offset in Bytes vom Anfang des Puffers, an dem das aktuelle Datenband beginnt. Der lLength-Parameter hat die Länge des aktuellen Datenbands in Bytes angegeben.

Bei Aufrufen, bei denen lMessage auf IT_MSG_DATA oder IT_MSG_STATUS festgelegt ist, enthält der lStatus-Parameter einen gültigen Wert. Der Inhalt sollte nicht verwendet werden, wenn lMessage andere Werte enthält.

Wenn lMessage IT_MSG_DATA_HEADER ist, zeigt der pbBuffer-Parameter auf eine WIA_DATA_CALLBACK_HEADER-Struktur .

Wenn während einer Bilddatenübertragung ein Fehler aufgetreten ist, legt der Treiber lMessage auf IT_MSG_DEVICE_STATUS fest. Das Proxyrückrufobjekt ruft ReportStatus auf, das den Fehler behandelt und dem Benutzer Meldungen anzeigt.

Beispiele

Das folgende Beispiel zeigt eine mögliche Möglichkeit zum Implementieren der IWiaDataCallback::BandedDataCallback-Methode .

Der Beispielanwendungscode definiert das CDataCallback-Objekt , das von der IWiaDataCallback-Schnittstelle abgeleitet wird. Die Anwendung muss ein CDataCallback-Objekt instanziieren. Anschließend wird CDataCallback::QueryInterface aufgerufen, um einen IWiaDataCallback-Schnittstellenzeiger abzurufen. Wenn die Anwendung zum Empfangen von Daten bereit ist, ruft sie die idtGetBandedData-Methode auf und übergibt der Methode einen Zeiger an die IWiaDataCallback-Schnittstelle .

In regelmäßigen Abständen verwendet die idtGetBandedData-Methode den IWiaDataCallback-Schnittstellenzeiger , um die CDataCallback::BandedDataCallback-Methode der Anwendung aufzurufen. Die ersten Aufrufe senden status Nachrichten. Darauf folgt ein Aufruf, der einen Datenheader an die Rückrufmethode überträgt. Nachdem die Anwendung den Datenheader empfangen hat, ruft idtGetBandedDataCDataCallback::BandedDataCallback auf, um Daten an die Anwendung zu übertragen. Wenn die Datenübertragung abgeschlossen ist, ruft sie die Rückrufmethode ein letztes Mal auf, um eine Beendigungsnachricht zu übertragen.


//
// 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;
    }
};

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional, Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile wia_xp.h (einschließlich Wia.h)
Bibliothek Wiaguid.lib