Поделиться через


Передача данных изображений в WIA 1.0

Примечание

Это руководство посвящено передаче данных изображений в приложениях, которые будут работать под управлением Windows XP или более ранней версии. Сведения о передаче данных образов в приложениях, которые будут работать в Windows Vista или более поздних версиях, см. в статье Передача данных образов в WIA 2.0 .

 

Используйте методы интерфейса IWiaDataTransfer для передачи данных с устройства получения образов Windows (WIA) 1.0 в приложение. Этот интерфейс поддерживает окно общей памяти для передачи данных из объекта устройства в приложение и устранения ненужных копий данных во время маршалинга.

Приложения должны запрашивать элемент изображения, чтобы получить указатель на его интерфейс IWiaDataTransfer , как показано в следующем примере кода:

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

В предыдущем коде предполагается, что pWiaItem является допустимым указателем на интерфейс IWiaItem . Вызов IUnknown::QueryInterface заполняет pWiaDataTransfer указателем на интерфейс IWiaDataTransfer элемента, на который ссылается pWiaItem.

Затем приложение задает элементы структуры STGMEDIUM . Дополнительные сведения см. в разделе STGMEDIUM и TYMED.

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

Если вы укажаете имя файла, оно должно содержать соответствующее расширение файла; WIA 1.0 не предоставляет расширений файлов. Если член lpszFileNamestgMedium имеет значение NULL, WIA 1.0 создает случайное имя файла и путь для передаваемых данных. Перед вызовом ReleaseStgMedium переместите или скопируйте этот файл, так как эта функция удалит файл.

Затем приложение вызывает метод IWiaDataTransfer::idtGetData для запуска передачи данных:

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

В вызове IWiaDataTransfer::idtGetData второй параметр указывает указатель на интерфейс IWiaDataCallback . Приложения должны реализовать этот интерфейс для получения обратных вызовов во время передачи данных. Сведения о реализации этого интерфейса см. в разделе IWiaDataCallback::BandedDataCallback.

Затем приложение освобождает указатели на интерфейс IWiaDataTransfer и освобождает все данные, выделенные в структуре STGMEDIUM .

Приложение также может передавать изображение с помощью передачи данных в памяти вместо передачи файлов. В этом случае приложение использует метод idtGetBandedData вместо метода idtGetData.

Ниже приведен полный пример передачи данных.

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