2010-02-22 6 views
2

Я пытаюсь выполнить сканирование с помощью ADF с помощью VBA и библиотеки Windows Image Acquisition (WIA). Я пытаюсь проверить, загружены ли в АПД страницы, поэтому я знаю, нужно ли сканировать другую страницу. Эта функция, похоже, хорошо работает в Windows 7 (моя dev-машина), но не в Windows XP (производственные машины). Я знаю, что MS внес некоторые изменения в WIA, когда выпустила Vista, поэтому это может быть причиной проблемы.Статус обработки документов WIA возвращает 0, даже если ADF загружает страницы

Я включу весь вызов функции, надеюсь, предоставит достаточно контекста для моего вопроса. Эта функция является частью модуля класса, который я написал, поэтому он ссылается на другие функции в модуле класса. В интересах краткости я оставил эти другие функции, но с радостью отправлю их по запросу.

'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 
+0

Привет, на ваш вопрос ответа с другими задействованными функциями вашего класса, я хотел бы увидеть копию этого, если это возможно. Спасибо, Jeroen – 2011-05-10 10:41:29

+0

@mrdevis: В итоге появляется много других зависимостей. Причина, по которой я изначально предлагал показать эти другие части, заключалась в том, чтобы помочь потенциальным специалистам по устранению неполадок. С тех пор я решил свою проблему, поэтому я менее склонен идти на все проблемы с отправкой всех этих других функций и зависимостей. Если у вас есть конкретный вопрос относительно сканирования с vba или с помощью wia, вам будет лучше опубликовать свой собственный вопрос. – mwolfe02

ответ

0

Причиной этого работал в Dev машине (Windows 7), а не производственные машины (Windows XP) не имеет ничего общего с операционной системой. Разница была фактически в версии драйвера. Когда я протестировал сканер на машине dev, он подключился к обновлению Windows и загрузил самый последний драйвер, доступный для этого сканера. На компьютерах WinXP использовались более старые драйверы для одного и того же сканера. Обновляя драйверы сканера на компьютерах WinXP до последней версии, она устранила мою проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^