Twain Dialog Scanner. Как с ним работать? - VB

Узнай цену своей работы

Формулировка задачи:

Господа, возникла проблеммка! Нужно заюзать сканнер в VB-шной проге. Запустить сканирование по формату А4 и получить результат. Кто-нить знает как это делается, пришлите плиз вариант кода или ссылку на таковой, буду премного благодарен. Или может кто подскажет как юзать сканнер через другую прогу, например через FineReader?

Решение задачи: «Twain Dialog Scanner. Как с ним работать?»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. '-----------------------------
  4. ' Declaration for TWAIN_32.DLL
  5. '-----------------------------
  6. Private Declare Function DSM_Entry Lib 'TWAIN_32.DLL' _
  7.                                    (ByRef pOrigin As Any, _
  8.                                     ByRef pDest As Any, _
  9.                                     ByVal DG As Long, _
  10.                                     ByVal DAT As Long, _
  11.                                     ByVal MSG As Long, _
  12.                                     ByRef pData As Any) As Long
  13.  
  14. Private Type TW_VERSION
  15.     MajorNum        As Integer                  ' TW_UINT16
  16.    MinorNum        As Integer                  ' TW_UINT16
  17.    Language        As Integer                  ' TW_UINT16
  18.    Country         As Integer                  ' TW_UINT16
  19.    Info(1 To 34)   As Byte                     ' TW_STR32
  20. End Type
  21.  
  22. Private Type TW_IDENTITY
  23.     Id                      As Long             ' TW_UINT32
  24.    Version                 As TW_VERSION       ' TW_VERSION
  25.    ProtocolMajor           As Integer          ' TW_UINT16
  26.    ProtocolMinor           As Integer          ' TW_UINT16
  27.    SupportedGroups1        As Integer          ' TW_UINT32
  28.    SupportedGroups2        As Integer
  29.     Manufacturer(1 To 34)   As Byte             ' TW_STR32
  30.    ProductFamily(1 To 34)  As Byte             ' TW_STR32
  31.    ProductName(1 To 34)    As Byte             ' TW_STR32
  32. End Type
  33.  
  34. Private Type TW_USERINTERFACE
  35.     ShowUI   As Integer                         ' TW_BOOL
  36.    ModalUI  As Integer                         ' TW_BOOL
  37.    hParent  As Long                            ' TW_HANDLE
  38. End Type
  39.  
  40. Private Type TW_PENDINGXFERS
  41.     Count       As Integer                      ' TW_UINT16
  42.    Reserved1   As Integer                      ' TW_UINT32
  43.    Reserved2   As Integer
  44. End Type
  45.  
  46. Private Type TW_ONEVALUE
  47.     ItemType As Integer                         ' TW_UINT16
  48.    Item1    As Integer                         ' TW_UINT32
  49.    Item2    As Integer
  50. End Type
  51.  
  52. Private Type TW_CAPABILITY
  53.     Cap          As Integer                     ' TW_UINT16
  54.    ConType      As Integer                     ' TW_UINT16
  55.    hContainer   As Long                        ' TW_HANDLE
  56. End Type
  57.  
  58. Private Type TW_FIX32
  59.     Whole   As Integer                          ' TW_INT16
  60.    Frac    As Integer                          ' TW_UINT16
  61. End Type
  62.  
  63. Private Type TW_FRAME
  64.     Left     As TW_FIX32                        ' TW_FIX32
  65.    Top      As TW_FIX32                        ' TW_FIX32
  66.    Right    As TW_FIX32                        ' TW_FIX32
  67.    Bottom   As TW_FIX32                        ' TW_FIX32
  68. End Type
  69.  
  70. Private Type TW_IMAGELAYOUT
  71.     Frame            As TW_FRAME                ' TW_FRAME
  72.    DocumentNumber   As Long                    ' TW_UINT32
  73.    PageNumber       As Long                    ' TW_UINT32
  74.    FrameNumber      As Long                    ' TW_UINT32
  75. End Type
  76.  
  77. Private Type TW_EVENT
  78.     pEvent      As Long                         ' TW_MEMREF
  79.    TWMessage   As Integer                      ' TW_UINT16
  80. End Type
  81.  
  82. Private Const DG_CONTROL = 1
  83. Private Const DG_IMAGE = 2
  84.  
  85. Private Const MSG_GET = 1
  86. Private Const MSG_SET = 6
  87. Private Const MSG_XFERREADY = 257
  88. Private Const MSG_CLOSEDSREQ = 258
  89. Private Const MSG_OPENDSM = 769
  90. Private Const MSG_CLOSEDSM = 770
  91. Private Const         ByVal lpParam As Long) As Long
  92. Private Declare Function DestroyWindow Lib 'user32.dll' _
  93.                                        (ByVal hwnd As Long) As Long
  94.  
  95. Private Type BITMAPFILEHEADER
  96.     bfType      As Integer
  97.     bfSize      As Long
  98.     bfReserved1 As Integer
  99.     bfReserved2 As Integer
  100.     bfOffBits   As Long
  101. End Type
  102.  
  103. Private Type BITMAPINFOHEADER
  104.     biSize          As Long
  105.     biWidth         As Long
  106.     biHeight        As Long
  107.     biPlanes        As Integer
  108.     biBitCount      As Integer
  109.     biCompression   As Long
  110.     biSizeImage     As Long
  111.     biXPelsPerMeter As Long
  112.     biYPelsPerMeter As Long
  113.     biClrUsed       As Long
  114.     biClrImportant  As Long
  115. End Type
  116.  
  117. Private Type RGBQUAD
  118.     rgbBlue     As Byte
  119.     rgbGreen    As Byte
  120.     rgbRed      As Byte
  121.     rgbReserved As Byte
  122. End Type
  123.  
  124. Private Type POINTAPI
  125.     x As Long
  126.     y As Long
  127. End Type
  128.  
  129. Private Type MSG
  130.     hwnd    As Long
  131.     message As Long
  132.     wParam  As Long
  133.     lParam  As Long
  134.     time    As Long
  135.     pt      As POINTAPI
  136. End Type
  137.  
  138. Private Const GHND = 66
  139.  
  140. '---------------------------
  141. ' Declaration for this Class
  142. '---------------------------
  143. Private m_tAppID As TW_IDENTITY
  144. Private m_tSrcID As TW_IDENTITY
  145. Private m_lHndMsgWin As Long
  146. Private m_sImageName As String
  147. Private m_ColourType As TWAIN_CLASS_COLOURTYPE
  148.  
  149. Public Enum TWAIN_CLASS_COLOURTYPE
  150.     BW = 0
  151.     GREY = 1
  152.     RGB = 2
  153. End Enum
  154.  
  155. Public Function ScanTwain(ByVal Resolution As Integer, ByVal ColourType As TWAIN_CLASS_COLOURTYPE, _
  156.                           ByVal ImageName As String, ByVal ShowIndicators As Boolean) As Long
  157.        
  158.     Dim lRtn As Long
  159.    
  160.     On Local Error GoTo ErrPlace
  161.    
  162.     m_ColourType = ColourType
  163.     m_sImageName = ImageName
  164.    
  165.     m_lHndMsgWin = CreateWindowEx(0&, '#32770', 'TWAIN_MSG_WINDOW', 0&, _
  166.                                   10&, 10&, 150&, 50&, 0&, 0&, 0&, 0&)
  167.    If m_lHndMsgWin = 0 Then GoTo ErrPlace
  168.        
  169.     If OpenTwain() Then
  170.         lRtn = DestroyWindow(m_lHndMsgWin)
  171.         GoTo ErrPlace
  172.     End If
  173.    
  174.     If ShowIndicators = False Then lRtn = DoNotShowIndicators()
  175.  
  176.     If IsUIControlable() Then
  177.         lRtn = CloseTwain()
  178.         lRtn = DestroyWindow(m_lHndMsgWin)
  179.         GoTo ErrPlace
  180.     End If
  181.  
  182.     If SetMaxImageSize() Then
  183.         lRtn = CloseTwain()
  184.         lRtn = DestroyWindow(m_lHndMsgWin)
  185.         GoTo ErrPlace
  186.     End If
  187.  
  188.     If SetResolution(Resolution) Then
  189.         lRtn = CloseTwain()
  190.         lRtn = DestroyWindow(m_lHndMsgWin)
  191.         GoTo ErrPlace
  192.     End If
  193.  
  194.     If SetColor() Then
  195.         lRtn = CloseTwain()
  196.         lRtn = DestroyWindow(m_lHndMsgWin)
  197.         GoTo ErrPlace
  198.     End If
  199.  
  200.     If ColourType = RGB Then lRtn = SetBitDepth()
  201.    
  202.     If SetNumberOfImages() Then
  203.         lRtn = CloseTwain()
  204.         lRtn = DestroyWindow(m_lHndMsgWin)
  205.         GoTo ErrPlace
  206.     End If
  207.  
  208.     If Scan() Then
  209.         lRtn = CloseTwain()
  210.         lRtn = DestroyWindow(m_lHndMsgWin)
  211.         GoTo ErrPlace
  212.     End If
  213.  
  214.     If CloseTwain() Then
  215.         lRtn = DestroyWindow(m_lHndMsgWin)
  216.         GoTo ErrPlace
  217.     End If
  218.  
  219.     If DestroyWindow(m_lHndMsgWin) = 0 Then GoTo ErrPlace
  220.    
  221.     ScanTwain = 0
  222.     Exit Function
  223.    
  224. ErrPlace:
  225.     ScanTwain = 1
  226. End Function
  227.  
  228. Private Function OpenTwain() As Long
  229.     Dim lRtn As Long
  230.    
  231.     On Local Error GoTo ErrPlace
  232.    
  233.     Call ZeroMemory(VarPtr(m_tAppID), Len(m_tAppID))
  234.    
  235.     With m_tAppID
  236.         .Version.MajorNum = 1
  237.         .Version.Language = TWLG_CZECH
  238.         .Version.Country = TWCY_CZECHOSLOVAKIA  on
  239.  
  240. Private Function SetMaxImageSize() As Long
  241.     Dim tCapability As TW_CAPABILITY
  242.     Dim tOneValueWidth As TW_ONEVALUE
  243.     Dim tOneValueHeight As TW_ONEVALUE
  244.     Dim lpOneValue As Long
  245.     Dim tImageLayout As TW_IMAGELAYOUT
  246.     Dim lRtn As Long
  247.    
  248.     On Local Error GoTo ErrPlace
  249.    
  250.     '----------------------------------------
  251.    ' Get ICAP_PHYSICALWIDTH into TW_ONEVALUE
  252.    '----------------------------------------
  253.    tCapability.ConType = TWON_ONEVALUE
  254.     tCapability.Cap = ICAP_PHYSICALWIDTH
  255.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_GET, tCapability)
  256.     If lRtn Then GoTo ErrPlace
  257.    
  258.     lpOneValue = GlobalLock(tCapability.hContainer)
  259.     Call CopyMemory(VarPtr(tOneValueWidth), lpOneValue, Len(tOneValueWidth))
  260.     lRtn = GlobalUnlock(tCapability.hContainer)
  261.     lRtn = GlobalFree(tCapability.hContainer)
  262.    
  263.     '-----------------------------------------
  264.    ' Get ICAP_PHYSICALHEIGHT into TW_ONEVALUE
  265.    '-----------------------------------------
  266.    tCapability.ConType = TWON_ONEVALUE
  267.     tCapability.Cap = ICAP_PHYSICALHEIGHT
  268.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_GET, tCapability)
  269.     If lRtn Then GoTo ErrPlace
  270.    
  271.     lpOneValue = GlobalLock(tCapability.hContainer)
  272.     Call CopyMemory(VarPtr(tOneValueHeight), lpOneValue, Len(tOneValueHeight))
  273.     lRtn = GlobalUnlock(tCapability.hContainer)
  274.     lRtn = GlobalFree(tCapability.hContainer)
  275.        
  276.     '----------
  277.    ' Set frame
  278.    '----------
  279.    Call CopyMemory(VarPtr(tImageLayout.Frame.Right), VarPtr(tOneValueWidth.Item1), 4&)
  280.     Call CopyMemory(VarPtr(tImageLayout.Frame.Bottom), VarPtr(tOneValueHeight.Item1), 4&)
  281.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_IMAGE, DAT_IMAGELAYOUT, MSG_SET, tImageLayout)
  282.     If ((lRtn) And (lRtn <> 2)) Then GoTo ErrPlace
  283.    
  284.     SetMaxImageSize = 0
  285.     Exit Function
  286.    
  287. ErrPlace:
  288.     SetMaxImageSize = 1
  289. End Function
  290.  
  291. Private Function SetResolution(ByVal iRes As Integer) As Long
  292.     Dim tCapability As TW_CAPABILITY
  293.     Dim tOneValue As TW_ONEVALUE
  294.     Dim lhOneValue As Long
  295.     Dim lpOneValue As Long
  296.     Dim lRtn As Long
  297.    
  298.     On Local Error GoTo ErrPlace
  299.    
  300.     tCapability.ConType = TWON_ONEVALUE
  301.     tCapability.Cap = ICAP_XRESOLUTION
  302.    
  303.     '-----------------------
  304.    ' tCapability.hContainer
  305.    '-----------------------
  306.    tOneValue.ItemType = TWTY_FIX32
  307.     tOneValue.Item1 = iRes
  308.        
  309.     lhOneValue = GlobalAlloc(GHND, Len(tOneValue))
  310.     lpOneValue = GlobalLock(lhOneValue)
  311.     Call CopyMemory(lpOneValue, VarPtr(tOneValue), Len(tOneValue))
  312.     lRtn = GlobalUnlock(lhOneValue)
  313.     tCapability.hContainer = lhOneValue
  314.    
  315.     '------------
  316.    ' XResolution
  317.    '------------
  318.    lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_SET, tCapability)
  319.     If lRtn Then
  320.         lRtn = GlobalFree(lhOneValue)
  321.         GoTo ErrPlace
  322.     End If
  323.     lRtn = GlobalFree(lhOneValue)
  324.    
  325.     Call ZeroMemory(VarPtr(tCapability), Len(tCapability))
  326.     tCapability.ConType = TWON_ONEVALUE
  327.     tCapability.Cap = ICAP_YRESOLUTION
  328.    
  329.     '-----------------------
  330.    ' tCapability.hContainer
  331.    '-----------------------
  332.    tOneValue.ItemType = TWTY_FIX32
  333.     tOneValue.Item1 = iRes
  334.        
  335.     lhOneValue = GlobalAlloc(GHND, Len(tOneValue))
  336.     lpOneValue = GlobalLock(lhOneValue)
  337.     Call CopyMemory(lpOneValue, VarPtr(tOneValue), Len(tOneValue))
  338.     lRtn = GlobalUnlock(lhOneValue)
  339.     tCapability.hContainer = lhOneValue
  340.    
  341.     '------------
  342.    ' YResolution
  343.    '------------
  344.    lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_SET, tCapability)
  345.     If lRtn Then
  346.         lRtn = Gl   With
  347.    
  348.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, tUI)
  349.     If lRtn Then GoTo ErrPlace
  350.    
  351.     While GetMessage(tMSG, 0&, 0&, 0&)
  352.         Call ZeroMemory(VarPtr(tEvent), Len(tEvent))
  353.         tEvent.pEvent = VarPtr(tMSG)
  354.         lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, tEvent)
  355.         Select Case tEvent.TWMessage
  356.             Case MSG_XFERREADY
  357.                 GoTo MSGGET
  358.             Case MSG_CLOSEDSREQ
  359.                 GoTo MSGDISABLEDS
  360.         End Select
  361.         lRtn = TranslateMessage(tMSG)
  362.         lRtn = DispatchMessage(tMSG)
  363.     Wend
  364.    
  365. MSGGET:
  366.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, lhDIB)
  367.     If lRtn <> TWRC_XFERDONE Then
  368.         If lhDIB Then lRtn = GlobalFree(lhDIB)
  369.         lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, tPending)
  370.         lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI)
  371.         GoTo ErrPlace
  372.     End If
  373.    
  374.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, tPending)
  375.     If lRtn Then
  376.         If lhDIB Then lRtn = GlobalFree(lhDIB)
  377.         lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI)
  378.         GoTo ErrPlace
  379.     End If
  380.    
  381.     If SaveDibToFile(lhDIB) Then
  382.         If lhDIB Then lRtn = GlobalFree(lhDIB)
  383.         lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI)
  384.         GoTo ErrPlace
  385.     End If
  386.    
  387. MSGDISABLEDS:
  388.     lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI)
  389.     If lRtn Then
  390.         If lhDIB Then lRtn = GlobalFree(lhDIB)
  391.         GoTo ErrPlace
  392.     End If
  393.  
  394.     Scan = 0
  395.     Exit Function
  396.    
  397. ErrPlace:
  398.     Scan = 1
  399. End Function
  400.  
  401. Private Function SaveDibToFile(ByRef lhDIB As Long) As Long
  402.     Dim lpDIB As Long
  403.     Dim tBIH As BITMAPINFOHEADER
  404.     Dim tBFH As BITMAPFILEHEADER
  405.     Dim tRGB As RGBQUAD
  406.     Dim bDIBits() As Byte
  407.     Dim lDIBSize As Long
  408.     Dim iFileNum As Integer
  409.     Dim lRtn As Long
  410.    
  411.     On Local Error GoTo ErrPlace
  412.    
  413.     If Dir(m_sImageName, vbNormal Or vbReadOnly Or vbHidden Or vbSystem) <> '' Then
  414.        Call SetAttr(m_sImageName, vbNormal)
  415.         Call Kill(m_sImageName)
  416.     End If
  417.    
  418.     lpDIB = GlobalLock(lhDIB)
  419.     If lpDIB = 0 Then GoTo ErrPlace
  420.    
  421.     Call CopyMemory(VarPtr(tBIH), lpDIB, Len(tBIH))
  422.    
  423.     Select Case m_ColourType
  424.         Case BW
  425.             tBIH.biClrUsed = 2
  426.         Case GREY
  427.             tBIH.biClrUsed = 256
  428.         Case RGB
  429.             tBIH.biClrUsed = 0
  430.     End Select
  431.    
  432.     lDIBSize = Len(tBIH) + (tBIH.biClrUsed * Len(tRGB)) + _
  433.                (((tBIH.biWidth * tBIH.biBitCount + 31)  32) * 4 * tBIH.biHeight)
  434.     ReDim bDIBits(1 To lDIBSize) As Byte
  435.     Call CopyMemory(VarPtr(bDIBits(1)), lpDIB, lDIBSize)
  436.    
  437.     lRtn = GlobalUnlock(lhDIB)
  438.     If GlobalFree(lhDIB) = 0 Then lhDIB = 0
  439.    
  440.     With tBFH
  441.         .bfType = 19778     ' 'BM'
  442.        .bfSize = Len(tBFH) + lDIBSize
  443.         .bfOffBits = Len(tBFH) + Len(tBIH) + (tBIH.biClrUsed * Len(tRGB))
  444.     End With
  445.     iFileNum = FreeFile
  446.     Open m_sImageName For Binary As #iFileNum
  447.         Put #iFileNum, , tBFH
  448.         Put #iFileNum, , bDIBits()
  449.     Close #iFileNum
  450.    
  451.     SaveDibToFile = 0
  452.     Exit Function
  453.    
  454. ErrPlace:
  455.     SaveDibToFile = 1
  456. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут