다음을 통해 공유


Windows Vista 애플리케이션과 레거시 드라이버 간의 데이터 전송

호환성 계층을 사용하면 Windows Vista 애플리케이션이 레거시 드라이버에서 IWiaTransfer::D ownload(Microsoft Windows SDK 설명서에 설명됨)를 호출할 수 있습니다. 호환성 계층은 폴더 전송 코드와 형식 변환을 구현해야 합니다. 호환성 계층은 레거시 드라이버에서 여러 페이지를 항상 전송할 수 있도록 피더 전송을 위한 특수 코드를 구현합니다. Windows Vista 애플리케이션은 TYMED_FILE 전송하는 경우에도 피더 항목에서 검사하는 동안 항상 여러 페이지를 요청할 수 있어야 합니다. 다음 다이어그램에서는 Windows Vista 애플리케이션을 사용하는 레거시 드라이버를 보여 줍니다.

windows vista 애플리케이션과 레거시 드라이버 간의 데이터 전송을 보여 주는 다이어그램

WIA 서비스 내의 레거시 콜백 개체는 레거시 전송 메시지 및 데이터를 Windows Vista 전송 메시지로 변환하고 제공된 스트림에 데이터를 씁니다.

Windows Vista 애플리케이션은 TYMED_FILE 및 TYMED_MULTIPAGE_FILE 기대하므로 호환성 계층은 레거시 드라이버에서 TYMED_CALLBACK 및 TYMED_MULTIPAGE_CALLBACK Windows Vista 애플리케이션에 노출되지 않도록 해야 합니다.

호환성 계층의 이 부분을 구현하는 가장 간단한 방법은 항상 TYMED_FILE 및 TYMED_MULTIPAGE_FILE 설정된 레거시 드라이버를 호출하는 것이었습니다. 이렇게 하면 데이터가 애플리케이션의 스트림에 다시 기록되기 전에 드라이버가 항상 전체 이미지를 검사해야 했기 때문에 단점이 있습니다. 따라서 호환성 계층은 Windows Vista 애플리케이션이 형식 WiaImgFmt_BMP(WiaImgFmt_BMP 설정된 WIA_IPA_FORMAT 속성)의 검사를 요청할 때 TYMED_CALLBACK 사용합니다. 이렇게 하면 호환성 계층이 대역별로 데이터 백 밴드를 쓸 수 있습니다.

그러나 레거시 드라이버는 WiaImgFmt_BMP 지원하지 않지만 TYMED_CALLBACK WiaImgFmt_MEMORYBMP. 따라서 변환 콜백 개체는 BMP 파일 헤더를 만들고 이 파일 헤더를 애플리케이션에도 다시 작성해야 합니다. BMP 정보 헤더에서 BMP 파일 헤더를 직접 생성할 수 있는 경우와 같이 이 작업을 쉽게 수행할 수 있습니다. 그러나 BMP 정보 헤더의 높이가 0으로 설정된 경우가 있습니다. 이 경우 WIA 호환성 계층은 BMP 파일 헤더를 작성하고 BMP 정보 헤더를 업데이트하기 전에 모든 데이터가 전송될 때까지 기다려야 합니다.

TYMED_CALLBACK 이외의 TYMED 전송이 레거시 드라이버에서 미리 형성되는 이유는 다중 페이지 형식은 일반적으로 TYMED_MULTIPAGE_FILE만 지원되고 드라이버는 일반적으로 TYMED_CALLBACK TYMED_FILE 더 많은 형식을 지원하기 때문입니다.

TYMED_FILE 전송하는 동안 호환성 계층은 애플리케이션의 스트림에 데이터를 다시 쓰기 전에 전송이 완료될 때까지 기다립니다. 이 작업은 파일을 메모리에 매핑하고 메모리의 모든 데이터를 단일 쓰기 요청으로 다시 작성하여 수행됩니다.

TYMED_CALLBACK 전송하는 동안 호환성 계층은 레거시 드라이버에서 IT_MSG_DATA 전송 메시지를 받을 때마다 애플리케이션의 스트림에 다시 기록됩니다.

호환성 계층에는 FEEDER 전송을 위한 특수 코드도 포함되어 있습니다. 이 코드는 TYMED가 TYMED_MULTIPAGE_FILE 않더라도 호환성 계층이 ADF에서 여러 페이지를 전송할 수 있도록 합니다. 이렇게 하는 방법은 호환성 계층이 한 페이지만 요청할 때마다 드라이버에 여러 번 호출하도록 하는 것입니다. 이 솔루션을 사용하면 모든 레거시 드라이버가 Windows Vista 애플리케이션에서 호출할 때 피더에서 여러 페이지의 전송을 처리할 수 있습니다.

레거시 드라이버는 전송 중에 "대역 외" 메시지를 보낼 수 있습니다(예: 미리 보기). 이러한 메시지는 스트림 기반 전송 모델에 맞지 않으므로 무시됩니다.

TYMED 상수에 대한 자세한 내용은 TYMED 이해를 참조하세요.