애플리케이션별 WIA 항목 속성 읽기
애플리케이션이 WIA 항목 속성을 읽도록 요청하면 WIA 서비스는 IWiaMiniDrv::d rvReadItemProperties 메서드를 호출합니다.
IWiaMiniDrv::d rvReadItemProperties 메서드는 다음 작업을 수행해야 합니다.
읽는 속성에 런타임 업데이트가 필요한지 여부를 확인합니다. 읽는 WIA 속성을 확인하기 위해 WIA 미니드라이버에서 PROPSPEC 배열(Microsoft Windows SDK 설명서에 정의됨)을 사용할 수 있습니다. PROPSPEC 배열을 처리하기 전에 WIA 미니드라이버에서 항목 유형을 확인하는 것이 좋습니다. 이렇게 하면 모든 IWiaMiniDrv::d rvReadItemProperties 호출에서 배열을 트래버스할 필요가 줄어듭니다. 이 디바이스의 자식 항목에 런타임 속성이 없는 경우 루트 항목 속성 읽기 요청만 처리됩니다.
WIA 속성의 ID를 사용하여 wiasWriteMultiple 또는 wiasWritePropXxx 서비스 함수를 호출하여 현재 값을 업데이트합니다. 이렇게 하면 드라이버 항목에 저장된 WIA 속성 집합이 업데이트되고 WIA 서비스가 새 값을 애플리케이션에 반환합니다.
WIA 미니드라이버가 이 함수의 WIA 속성에 대한 런타임 조정을 수행하지 않으면 WIA 서비스는 현재 WIA 속성 값만 애플리케이션에 자동으로 반환합니다. 이 함수는 디바이스 클록과 같은 속성 또는 문서 공급 장치 상태 같은 하드웨어별 검사가 필요한 WIA 속성에만 사용해야 합니다.
IWiaMiniDrv::d rvReadItemProperties 구현
애플리케이션이 WIA 항목의 속성을 읽으려고 할 때 IWiaMiniDrv::d rvReadItemProperties 메서드가 호출됩니다. WIA 서비스는 먼저 이 메서드를 호출하여 드라이버에 알 수 있습니다. WIA 드라이버는 읽는 속성이 올바른지 확인해야 합니다. 디바이스 상태 필요한 속성(예: WIA_DPS_DOCUMENT_HANDLING_STATUS 또는 디바이스가 클록을 지원하는 경우 WIA_DPA_DEVICE_TIME)에 대한 하드웨어에 액세스하는 것이 좋습니다.
WIA 드라이버는 드문 경우에만 하드웨어와 통신해야 합니다. 이 호출에서 하드웨어와 너무 많이 통신하는 WIA 드라이버는 느리고 느리게 표시됩니다.
다음 예제에서는 IWiaMiniDrv::d rvReadItemProperties 메서드의 구현을 보여줍니다.
HRESULT _stdcall CWIADevice::drvReadItemProperties(
BYTE *pWiasContext,
LONG lFlags,
ULONG nPropSpec,
const PROPSPEC *pPropSpec,
LONG *plDevErrVal)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if (!pWiasContext) {
return E_INVALIDARG;
}
if (!plDevErrVal) {
return E_INVALIDARG;
}
if (!pPropSpec) {
return E_INVALIDARG;
}
*plDevErrVal = 0;
LONG lWIAItemType = 0;
HRESULT hr = wiasGetItemType(pWiasContext,&lWIAItemType);
if(S_OK == hr) {
//
// perform custom operations depending on the type of
// WIA item that was passed to drvReadItemProperties
//
if(lWIAItemType & WiaItemTypeRoot) {
//
// If the WIA_DPA_CONNECT_STATUS property ID is in the PROPSPEC
// array, then read the latest "Connect Status".
// If it is NOT then do nothing. (skip access to the hardware)
//
// NOTE: only read properties contained in the PROPSPEC array
// from the hardware that need device updates.
// If the property in PROPSPEC does not need to be read
// from the hardware, or updated, do nothing. The WIA service
// will supply the caller with the current value in the
// the WIA property set.
//
BOOL bReadLatestConnectStatus = FALSE;
//
// traverse the WIA PROPSPEC array, looking for known WIA
// properties that require run-time updates, or needs to be
// updated with hardware access.
//
for(ULONG ulIndex = 0; ulIndex < nPropSpec; ulIndex++) {
//
// look for WIA property IDs that really need hardware
// access, or run-time adjusting.
//
if(pPropSpec[ulIndex].propid == WIA_DPA_CONNECT_STATUS) {
bReadLatestConnectStatus = TRUE;
}
}
//
// The item passed in is a ROOT item
//
if(bReadLatestConnectStatus) {
//
// WIA_DPA_CONNECT_STATUS should be updated from the
// hardware
//
LONG lConnectStatus = HARDWARE_READ_ConnectStatus();
//
// update WIA_DPA_CONNECT_STATUS property value using
// wiasWritePropLong (). The pWiasContext passed in
// already represents the current item to be written to.
//
hr = wiasWritePropLong(pWiasContext,WIA_DPA_CONNECT_STATUS,lConnectStatus);
if(S_OK == hr) {
//
// The WIA_DPA_CONNECT_STATUS property was successfully updated
//
} else {
//
// wiasWritePropLong() failed to write the WIA
// property. The WIA_DPA_CONNECT_STATUS
// property was NOT updated
//
}
}
} else {
//
// The item passed in is any other child item
//
}
} else {
//
// wiasGetItemType() failed to get the current item type
//
}
return hr;
}