Freigeben über


Übertragen von Bilddaten in WIA 1.0

Hinweis

In diesem Tutorial geht es um das Übertragen von Imagedaten in Anwendungen, die Windows XP oder früher ausführen. Informationen zum Übertragen von Imagedaten in Anwendungen, die unter Windows Vista oder höher ausgeführt werden, finden Sie unter Übertragen von Bilddaten in WIA 2.0 .

 

Verwenden Sie die Methoden der IWiaDataTransfer-Schnittstelle , um Daten von einem Windows Image Acquisition 1.0-Gerät (WIA) 1.0 an eine Anwendung zu übertragen. Diese Schnittstelle unterstützt ein Shared Memory-Fenster, um Daten vom Geräteobjekt an die Anwendung zu übertragen und unnötige Datenkopien während des Marshallings zu vermeiden.

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

    // 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, auf das von pWiaItem verwiesen wird.

Die Anwendung legt dann die STGMEDIUM-Strukturmember 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 gibt dann die Zeiger auf die IWiaDataTransfer-Schnittstelle frei und gibt alle Daten frei, die in der STGMEDIUM-Struktur zugeordnet sind.

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

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