ADFは、ページがロードされた0にもかかわらずWIA文書ステータスリターンの取り扱い

StackOverflow https://stackoverflow.com/questions/2313395

  •  22-09-2019
  •  | 
  •  

質問

私は、VBAを使用してADFおよびWindowsイメージの取得ライブラリ(WIA)からスキャンしようとしています。私は、私は別のページをスキャンするかどうかを知っているので、ADFにロードされたページがあるかどうかを確認しようとしています。この機能は、ほかのWindows 7(私のdevのマシン)ではなく、WindowsのXP(生産機)で動作するようです。私はそれがVistaをリリースしたときにMSがWIAにいくつかの変更をした知っているので、これは問題の根本的かもしれません。

私はうまくいけば私の質問に十分なコンテキストを提供するために、全体の関数呼び出しが含まれます。この機能は、私が書いたクラスモジュールの一部であり、それは、クラスモジュール内の他の関数を参照します。簡潔にするために、私はそれらの他の機能を残してきたが、要請があれば喜んでそれらを掲示します。

'Windows Imaging Acquisition (WIA) Constants
Private Const wiaFormatBMP As String = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
Private Const wiaFormatGIF As String = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
Private Const wiaFormatJPEG As String = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
Private Const wiaFormatPNG As String = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
Private Const wiaFormatTIFF As String = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"

Public Function ScanPage(Optional ShowScanningWizard As Boolean = True, _
                         Optional OverWrite As Boolean = False, _
                         Optional AppendToTiff As Boolean = True, _
                         Optional DocType As scanDocType = scanAuto, _
                         Optional HRes As Integer = 150, _
                         Optional VRes As Integer = 150, _
                         Optional width As Double = 8.5, _
                         Optional height As Double = 11, _
                         Optional UseADF As Boolean = False) As Boolean
    'Windows Imaging Acquisition (WIA) Constants
Const ScannerDeviceType = 1
Const wiaIntentColor As Long = 1
Const wiaIntentGray As Long = 2
Const wiaIntentBlackWhite As Long = &H10004  '&H4 = IntentBlackWhite + &H10000 = Minimize Size   '&H20000'131072

Dim cd As Object    'WIA.CommonDialog
Dim dev As Object    'WIA.Device
Dim ip As Object    'WIA.ImageProcess
Dim Prop As Object    'WIA.Property
Dim img As Object    'WIA.ImageFile

Dim Intent As Long
Dim MorePages As Boolean

    On Error GoTo Err_ScanPage

    ScanPage = False

    'Verify scanned page can be saved
    If Len(m_sFileName) = 0 Then
        Err.Raise 5, , "Scan Aborted - No filename provided"
    ElseIf IsTiff And AppendToTiff Then
        'we're ok
    ElseIf m_bFileExists And Not OverWrite Then
        Err.Raise 58    'File already exists
    End If

    Set cd = CreateObject("WIA.CommonDialog")
    Set dev = cd.ShowSelectDevice(ScannerDeviceType)
    Set ip = CreateObject("WIA.ImageProcess")


    'Set up conversion filter
    ip.Filters.Add ip.FilterInfos("Convert").FilterID
    ip.Filters(ip.Filters.Count).Properties("FormatID").Value = FileFormat
    Select Case FileFormat
    Case wiaFormatJPEG
        ip.Filters(ip.Filters.Count).Properties("Quality").Value = 85
    Case wiaFormatTIFF
        'IP.Filters(IP.Filters.Count).Properties("Compression").Value = "CCITT4"
    End Select

    'Set intent for current document
    If DocType <> scanAuto Then m_eScanType = DocType
    If m_eScanType = scanDocument Then
        Intent = wiaIntentBlackWhite    'wiaIntentGray
    Else
        Intent = wiaIntentColor
    End If

    DoEvents
    If ShowScanningWizard Then
        Set img = cd.ShowAcquireImage(ScannerDeviceType, , , FileFormat)
    Else
        With dev.items(1)
            .Properties("Current Intent").Value = Intent
            .Properties("Horizontal Resolution").Value = HRes
            .Properties("Vertical Resolution").Value = VRes
            .Properties("Horizontal Extent").Value = HRes * width
            .Properties("Vertical Extent").Value = VRes * height
            If m_eScanType = scanDocument Then
                'Darken documents a bit so that handwriting is easier to see
                '   * Brightness is a value between -127 and +127
                '   * -45 was reached through trial and error and was tested on
                '     a CanoScan LiDE 20 flatbed scanner
                .Properties("Brightness").Value = -45
            End If

        End With
        On Error Resume Next
'        For Each Prop In dev.items(1).Properties
'            Debug.Print Prop.PropertyID, Prop.Name, Prop.Value
'        Next Prop
        'Scan the image
        If UseADF Then
            MorePages = True
            For Each Prop In dev.Properties
                Select Case Prop.PropertyID
                Case 3087 'Document Handling Select (1 = ADF)
                    MorePages = MorePages And (Prop.Value = 1)
                Case 3088 'Document Handling Status (1 = Page ready in ADF)
                    MorePages = MorePages And (Prop.Value = 1)
                End Select
            Next Prop
            If MorePages Then Set img = cd.ShowTransfer(dev.items(1), , True) ' dev.Items(1).Transfer()
        Else
            Set img = cd.ShowTransfer(dev.items(1), , True)
        End If
        If Err.Number <> 0 Then
            'User canceled the scan (most likely cause of error)
            Err.Clear
            ScanPage = False
            GoTo Exit_ScanPage
        End If
        On Error GoTo Err_ScanPage
    End If


    If img Is Nothing Then GoTo Exit_ScanPage
    'Convert to proper format
    Set img = ip.Apply(img)

    If IsTiff And AppendToTiff Then
        m_iNumPages = m_iNumPages + 1
        If m_iNumPages = 1 Then
            'ReDim Preserve throws an error if the array is currently empty
            ReDim m_sFNames(1 To 1)
        Else
            ReDim Preserve m_sFNames(1 To m_iNumPages)
        End If
        m_sFNames(m_iNumPages) = TempFileName(TempFilesPath, "tif")
        img.SaveFile m_sFNames(m_iNumPages)
        SaveToMultiTiff
        m_bFileExists = True
        ExtractPages
    Else
        If m_bFileExists And OverWrite Then Kill m_sFileName
        img.SaveFile m_sFileName
        m_iNumPages = 1
        m_bFileExists = True
    End If

    ScanPage = True

Exit_ScanPage:
    Exit Function
Err_ScanPage:
    Select Case Err.Number
    Case Else
        LogError Err.Number, Err.Description, "ScanPage", "clsScan"
    End Select
    Resume Exit_ScanPage
End Function
役に立ちましたか?

解決

これはのdevのマシンで働いていた理由(Windows 7の)とない生産機械(Windows XPの)オペレーティングシステムとは何の関係もありませんでした。違いは、ドライバのバージョンでは、実際にしました。私はdevのマシン上でスキャナをテストしたとき、それはWindowsアップデートに接続されており、そのスキャナで利用可能な最新のドライバをダウンロードしました。 WinXPのマシンは同じスキャナ用の古いドライバを使用していました。最新バージョンにWinXPのマシン上のスキャナドライバを更新することにより、それは私の問題を修正します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top