Übertragen von Bilddaten in WIA 1.0

Hinweis

In diesem Lernprogramm werden Bilddaten in Anwendungen übertragen, die Windows XP oder früher ausgeführt werden. Informationen zum Übertragen von Bilddaten in WIA 2.0 finden Sie unter Übertragen von Bilddaten in Anwendungen, die auf Windows Vista oder höher ausgeführt werden.

 

Verwenden Sie die Methoden der IWiaDataTransfer-Schnittstelle, um Daten von einem Windows Image Acquisition (WIA) 1.0-Gerät an eine Anwendung zu übertragen. Diese Schnittstelle unterstützt ein freigegebenes Speicherfenster, um Daten aus dem Geräteobjekt an die Anwendung zu übertragen und unnötige Datenkopien während der Marshallung zu beseitigen.

Anwendungen müssen ein Bildelement abfragen, um einen Zeiger auf die IWiaDataTransfer-Schnittstelle abzurufen, wie im folgenden Codebeispiel:

    // Get the IWiaDataTransfer interface
    //
    IWiaDataTransfer *pWiaDataTransfer = NULL;
    hr = pWiaItem->QueryInterface( IID_IWiaDataTransfer, (void**)&pWiaDataTransfer );

Im vorherigen Code wird davon ausgegangen, dass pWiaItem ein gültiger Zeiger auf die IWiaItem-Schnittstelle ist. Der Aufruf von IUnknown::QueryInterface füllt pWiaDataTransfer mit einem Zeiger auf die IWiaDataTransfer-Schnittstelle des Elements, das von pWiaItem bezeichnet wird.

Die Anwendung legt dann die Elemente der STGMEDIUM-Struktur fest. Weitere Informationen finden Sie unter STGMEDIUM und TYMED.

    // Set storage medium
    //
    STGMEDIUM StgMedium = {0};
    StgMedium.tymed = TYMED_FILE;

Wenn Sie einen Dateinamen angeben, sollte er die richtige Dateierweiterung enthalten; WIA 1.0 bietet keine Dateierweiterungen. Wenn das lpszFileName-Element von StgMediumNULL ist, generiert WIA 1.0 einen zufälligen Dateinamen und Pfad für die übertragenen Daten. Verschieben oder Kopieren Sie diese Datei, bevor Sie ReleaseStgMedium aufrufen, da diese Funktion die Datei löscht.

Die Anwendung ruft dann die IWiaDataTransfer::idtGetData-Methode auf, um die Datenübertragung auszuführen:

    // Perform the transfer
    //
    hr = pWiaDataTransfer->idtGetData( &stgMedium, pWiaDataCallback );

Im Aufruf von IWiaDataTransfer::idtGetData gibt der zweite Parameter einen Zeiger auf die IWiaDataCallback-Schnittstelle an. Anwendungen müssen diese Schnittstelle implementieren, um Rückrufe während der Datenübertragung zu empfangen. Informationen zum Implementieren dieser Schnittstelle finden Sie unter IWiaDataCallback::BandedDataCallback.

Die Anwendung veröffentlicht dann die Zeiger auf die IWiaDataTransfer-Schnittstelle und freigibt alle Daten, die in der STGMEDIUM-Struktur zugewiesen sind.

Die Anwendung kann auch das Bild mithilfe von Speicherdatenübertragungen anstelle von Dateiübertragungen übertragen. In diesem Fall verwendet die Anwendung die idtGetBandedData-Methode anstelle der idtGetData-Methode.

Nachfolgend sehen Sie das vollständige Beispiel für die Datenübertragung:

HRESULT TransferWiaItem( IWiaItem *pWiaItem )
{
    //
    // Validate arguments
    //
    if (NULL == pWiaItem)
    {
        return E_INVALIDARG;
    }

    //
    // Get the IWiaPropertyStorage interface so you can set required properties.
    //
    IWiaPropertyStorage *pWiaPropertyStorage = NULL;
    HRESULT hr = pWiaItem->QueryInterface( IID_IWiaPropertyStorage, (void**)&pWiaPropertyStorage );
    if (SUCCEEDED(hr))
    {
        //
        // Prepare PROPSPECs and PROPVARIANTs for setting the
        // media type and format
        //
        PROPSPEC PropSpec[2] = {0};
        PROPVARIANT PropVariant[2] = {0};
        const ULONG c_nPropCount = sizeof(PropVariant)/sizeof(PropVariant[0]);

        //
        // Use BMP as the output format
        //
        GUID guidOutputFormat = WiaImgFmt_BMP;

        //
        // Initialize the PROPSPECs
        //
        PropSpec[0].ulKind = PRSPEC_PROPID;
        PropSpec[0].propid = WIA_IPA_FORMAT;
        PropSpec[1].ulKind = PRSPEC_PROPID;
        PropSpec[1].propid = WIA_IPA_TYMED;

        //
        // Initialize the PROPVARIANTs
        //
        PropVariant[0].vt = VT_CLSID;
        PropVariant[0].puuid = &guidOutputFormat;
        PropVariant[1].vt = VT_I4;
        PropVariant[1].lVal = TYMED_FILE;

        //
        // Set the properties
        //
        hr = pWiaPropertyStorage->WriteMultiple( c_nPropCount, PropSpec, PropVariant, WIA_IPA_FIRST );
        if (SUCCEEDED(hr))
        {
            //
            // Get the IWiaDataTransfer interface
            //
            IWiaDataTransfer *pWiaDataTransfer = NULL;
            hr = pWiaItem->QueryInterface( IID_IWiaDataTransfer, (void**)&pWiaDataTransfer );
            if (SUCCEEDED(hr))
            {
                //
                // Create our callback class
                //
                CWiaDataCallback *pCallback = new CWiaDataCallback;
                if (pCallback)
                {
                    //
                    // Get the IWiaDataCallback interface from our callback class.
                    //
                    IWiaDataCallback *pWiaDataCallback = NULL;
                    hr = pCallback->QueryInterface( IID_IWiaDataCallback, (void**)&pWiaDataCallback );
                    if (SUCCEEDED(hr))
                    {
                        //
                        // Perform the transfer using default settings
                        //
                        STGMEDIUM stgMedium = {0};
                        StgMedium.tymed = TYMED_FILE;
                        hr = pWiaDataTransfer->idtGetData( &stgMedium, pWiaDataCallback );
                        if (S_OK == hr)
                        {
                            //
                            // Print the filename (note that this filename is always
                            // a WCHAR string, not TCHAR).
                            //
                            _tprintf( TEXT("Transferred filename: %ws\n"), stgMedium.lpszFileName );

                            //
                            // Release any memory associated with the stgmedium
                            // This will delete the file stgMedium.lpszFileName.
                            //
                            ReleaseStgMedium( &stgMedium );
                        }

                        //
                        // Release the callback interface
                        //
                        pWiaDataCallback->Release();
                        pWiaDataCallback = NULL;
                    }

                    //
                    // Release our callback.  It should now delete itself.
                    //
                    pCallback->Release();
                    pCallback = NULL;
                }

                //
                // Release the IWiaDataTransfer
                //
                pWiaDataTransfer->Release();
                pWiaDataTransfer = NULL;
            }
        }

        //
        // Release the IWiaPropertyStorage
        //
        pWiaPropertyStorage->Release();
        pWiaPropertyStorage = NULL;
    }

    return hr;
}