레거시 애플리케이션과 Windows Vista 드라이버 간의 데이터 전송
호환성 계층은 드라이버의 이미지 처리 필터가 항상 호출되고 LocalService 계정을 명시적으로 지원하지 않는 레거시 애플리케이션이 여전히 데이터 전송을 수행할 수 있도록 해야 합니다. LocalService 계정은 Microsoft Windows XP 이상 운영 체제에서 사용할 수 있습니다.
최소한 레거시 드라이버는 TYMED_FILE 및 TYMED_CALLBACK 모두 노출해야 합니다. 그러나 Windows Vista 드라이버는 TYMED_CALLBACK(또는 TYMED_MULTIPAGE_CALLBACK)을 노출하지 않습니다. 호환성 계층의 전송 부분은 Windows Vista 드라이버가 구현하지 않더라도 레거시 애플리케이션에 TYMED_CALLBACK 표시되도록 합니다. TYMED_MULTIPAGE_CALLBACK Windows Vista 드라이버에서 노출되지 않습니다.
레거시 애플리케이션에는 Windows Vista 드라이버가 노출하는 TYMED_FILE 및 TYMED_MULTIPAGE_FILE 지원되는 형식이 표시됩니다. TYMED_CALLBACK 경우 레거시 애플리케이션은 드라이버가 TYMED_FILE 대해 노출하는 것과 동일한 형식을 볼 수 있습니다. 단, 한 가지 예외는 WiaImgFmt_BMP 노출하는 대신 호환성 계층이 레거시 애플리케이션에 WiaImgFmt_MEMORYBMP 노출합니다. 이 작업을 수행하는 방법은 IWiaMiniDrv::d rvGetWiaFormatInfo에 대한 호환성 계층 "인터셉트" 호출을 수행하고 TYMED_CALLBACK 대한 모든 Windows Vista 드라이버의 TYMED_FILE 형식(WiaImgFmt_BMP WiaImgFmt_MEMORYBMP / 제외)을 추가하는 것입니다. 가장 중요한 것은 호환성 계층은 데이터 전송 중에 자체 레거시 콜백 개체를 만들어 Windows Vista 전송 메시지와 스트림에 기록된 데이터를 레거시 전송 메시지로 변환합니다.
TYMED 상수에 대한 자세한 내용은 TYMED 이해를 참조하세요.
호환성 계층은 WIA COM 프록시에 두 개의 콜백 개체를 만듭니다. 하나는 콜백 전송용이고 다른 하나는 파일 전송용입니다. WIA COM 프록시는 IWiaTransferCallback 인터페이스를 구현합니다. 이 콜백 개체는 스트림 기반 전송과 "이전 스타일" 전송 간의 변환을 처리합니다. WIA 호환성 계층은 호환성 계층의 콜백 개체를 전달하는 드라이버의 이미지 처리 필터도 시작합니다. 따라서 이미지 처리 필터는 Windows Vista 전송과 마찬가지로 항상 애플리케이션의 컨텍스트에서 실행됩니다.
다음 다이어그램에서는 호환성 계층이 Windows Vista 드라이버 및 레거시 애플리케이션에서 작동하는 방법을 보여 줍니다.
WIA COM 프록시 내의 레거시 콜백 개체는 Windows Vista 전송 메시지와 스트림에 기록된 데이터를 레거시 전송 메시지로 변환하고 데이터를 파일 또는 대역폭 데이터 콜백에 씁니다.
드라이버가 IWiaMiniDrvTransferCallback::GetNextStream 메서드에서 수신하는 IStream 인터페이스에서 노출되는 메서드를 호출하는 경우(드라이버는 IStream::Write, IStream::Seek 및 IStream::SetSize만 호출해야 합니다). 따라서 호환성 계층은 WIA COM 프록시가 제공하는 IStream 인터페이스를 래핑하는 사용자 지정 IStream 구현을 만듭니다.
레거시 파일 전송은 간단합니다. 이러한 전송의 예는 레거시 애플리케이션이 IWiaDataTransfer::idtGetData를 호출하는 경우입니다. 호환성 계층은 애플리케이션이 STGMEDIUM 구조에 지정하는 파일에 데이터 스트림을 만듭니다. 이 스트림은 IWiaTransferCallback::GetNextStream 을 호출할 때 드라이버 또는 이미지 처리 필터에 전달되며 모든 전송 메시지는 레거시 전송 메시지에 쉽게 매핑됩니다. 메시지가 매핑되는 방법에 대한 자세한 설명은 WIA 호환성 계층 데이터 전송 구현을 참조하세요.
IWiaDataTransfer::d GetData 메서드를 호출할 때 호환성 계층은 몇 가지 더 엄격한 매개 변수 검사를 수행합니다. 예를 들어 호환성 계층은 TYMED_FILE사용하여 IWiaDataTrasnfer::idtGetData 메서드를 호출할 수 없으며 페이지 수가 더 높으면 호환성 계층을 활용하지 않는 In 데이터 전송에서는 TYMED_FILE IWiaDataTrasnfer::idtGetData 메서드를 호출할 수 있었고 그 다음에는 페이지 수가 더 큽니다.
레거시 콜백 전송은 조금 더 까다롭습니다. Windows Vista 드라이버는 레거시 드라이버에 필요한 WiaImgFmt_MEMORYBMP 지원하지 않으므로 호환성 계층의 콜백 개체는 WiaImgFmt_BMP WiaImgFmt_MEMORYBMP변환을 처리해야 합니다. 전송 메시지 간의 매핑도 간단하지 않습니다. 호환성 계층은 자체 스트림 구현을 만듭니다. 호환성 계층은 애플리케이션에서 IStream::Write 메서드를 호출할 때 애플리케이션의 콜백에 IT_MSG_DATA 메시지를 보냅니다.
호환성 계층 구현의 일부로 IWiaTransfer 인터페이스를 변경해야 했습니다. IWiaTransfer::EnumWIA_FORMAT_INFO 함수가 IWiaTransfer 에 추가되어 TYMED_MULTIPAGE_FILE 전송을 허용합니다. 이 추가는 호환성 계층의 결과가 아니지만 IWiaTransfer 인터페이스 또는 IWiaItem2 인터페이스에서 IWiaItem 인터페이스로 IWiaDataTransfer 인터페이스에 연결할 수 없기 때문에 필요합니다.
IWiaDataTransfer, IWiaTransfer, IWiaItem, IWiaItem2 및 IStream 인터페이스 및 STGMEDIUM 구조체는 Microsoft Windows SDK 설명서에 설명되어 있습니다.