Передача данных изображений в 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;
}