Twain Dialog Scanner. Как с ним работать? - VB
Формулировка задачи:
Господа, возникла проблеммка! Нужно заюзать сканнер в VB-шной проге.
Запустить сканирование по формату А4 и получить результат.
Кто-нить знает как это делается, пришлите плиз вариант кода или ссылку на таковой, буду премного благодарен.
Или может кто подскажет как юзать сканнер через другую прогу, например через FineReader?
Решение задачи: «Twain Dialog Scanner. Как с ним работать?»
textual
Листинг программы
Option Explicit '----------------------------- ' Declaration for TWAIN_32.DLL '----------------------------- Private Declare Function DSM_Entry Lib 'TWAIN_32.DLL' _ (ByRef pOrigin As Any, _ ByRef pDest As Any, _ ByVal DG As Long, _ ByVal DAT As Long, _ ByVal MSG As Long, _ ByRef pData As Any) As Long Private Type TW_VERSION MajorNum As Integer ' TW_UINT16 MinorNum As Integer ' TW_UINT16 Language As Integer ' TW_UINT16 Country As Integer ' TW_UINT16 Info(1 To 34) As Byte ' TW_STR32 End Type Private Type TW_IDENTITY Id As Long ' TW_UINT32 Version As TW_VERSION ' TW_VERSION ProtocolMajor As Integer ' TW_UINT16 ProtocolMinor As Integer ' TW_UINT16 SupportedGroups1 As Integer ' TW_UINT32 SupportedGroups2 As Integer Manufacturer(1 To 34) As Byte ' TW_STR32 ProductFamily(1 To 34) As Byte ' TW_STR32 ProductName(1 To 34) As Byte ' TW_STR32 End Type Private Type TW_USERINTERFACE ShowUI As Integer ' TW_BOOL ModalUI As Integer ' TW_BOOL hParent As Long ' TW_HANDLE End Type Private Type TW_PENDINGXFERS Count As Integer ' TW_UINT16 Reserved1 As Integer ' TW_UINT32 Reserved2 As Integer End Type Private Type TW_ONEVALUE ItemType As Integer ' TW_UINT16 Item1 As Integer ' TW_UINT32 Item2 As Integer End Type Private Type TW_CAPABILITY Cap As Integer ' TW_UINT16 ConType As Integer ' TW_UINT16 hContainer As Long ' TW_HANDLE End Type Private Type TW_FIX32 Whole As Integer ' TW_INT16 Frac As Integer ' TW_UINT16 End Type Private Type TW_FRAME Left As TW_FIX32 ' TW_FIX32 Top As TW_FIX32 ' TW_FIX32 Right As TW_FIX32 ' TW_FIX32 Bottom As TW_FIX32 ' TW_FIX32 End Type Private Type TW_IMAGELAYOUT Frame As TW_FRAME ' TW_FRAME DocumentNumber As Long ' TW_UINT32 PageNumber As Long ' TW_UINT32 FrameNumber As Long ' TW_UINT32 End Type Private Type TW_EVENT pEvent As Long ' TW_MEMREF TWMessage As Integer ' TW_UINT16 End Type Private Const DG_CONTROL = 1 Private Const DG_IMAGE = 2 Private Const MSG_GET = 1 Private Const MSG_SET = 6 Private Const MSG_XFERREADY = 257 Private Const MSG_CLOSEDSREQ = 258 Private Const MSG_OPENDSM = 769 Private Const MSG_CLOSEDSM = 770 Private Const ByVal lpParam As Long) As Long Private Declare Function DestroyWindow Lib 'user32.dll' _ (ByVal hwnd As Long) As Long Private Type BITMAPFILEHEADER bfType As Integer bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfOffBits As Long End Type Private Type BITMAPINFOHEADER biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbReserved As Byte End Type Private Type POINTAPI x As Long y As Long End Type Private Type MSG hwnd As Long message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End Type Private Const GHND = 66 '--------------------------- ' Declaration for this Class '--------------------------- Private m_tAppID As TW_IDENTITY Private m_tSrcID As TW_IDENTITY Private m_lHndMsgWin As Long Private m_sImageName As String Private m_ColourType As TWAIN_CLASS_COLOURTYPE Public Enum TWAIN_CLASS_COLOURTYPE BW = 0 GREY = 1 RGB = 2 End Enum Public Function ScanTwain(ByVal Resolution As Integer, ByVal ColourType As TWAIN_CLASS_COLOURTYPE, _ ByVal ImageName As String, ByVal ShowIndicators As Boolean) As Long Dim lRtn As Long On Local Error GoTo ErrPlace m_ColourType = ColourType m_sImageName = ImageName m_lHndMsgWin = CreateWindowEx(0&, '#32770', 'TWAIN_MSG_WINDOW', 0&, _ 10&, 10&, 150&, 50&, 0&, 0&, 0&, 0&) If m_lHndMsgWin = 0 Then GoTo ErrPlace If OpenTwain() Then lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If ShowIndicators = False Then lRtn = DoNotShowIndicators() If IsUIControlable() Then lRtn = CloseTwain() lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If SetMaxImageSize() Then lRtn = CloseTwain() lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If SetResolution(Resolution) Then lRtn = CloseTwain() lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If SetColor() Then lRtn = CloseTwain() lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If ColourType = RGB Then lRtn = SetBitDepth() If SetNumberOfImages() Then lRtn = CloseTwain() lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If Scan() Then lRtn = CloseTwain() lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If CloseTwain() Then lRtn = DestroyWindow(m_lHndMsgWin) GoTo ErrPlace End If If DestroyWindow(m_lHndMsgWin) = 0 Then GoTo ErrPlace ScanTwain = 0 Exit Function ErrPlace: ScanTwain = 1 End Function Private Function OpenTwain() As Long Dim lRtn As Long On Local Error GoTo ErrPlace Call ZeroMemory(VarPtr(m_tAppID), Len(m_tAppID)) With m_tAppID .Version.MajorNum = 1 .Version.Language = TWLG_CZECH .Version.Country = TWCY_CZECHOSLOVAKIA on Private Function SetMaxImageSize() As Long Dim tCapability As TW_CAPABILITY Dim tOneValueWidth As TW_ONEVALUE Dim tOneValueHeight As TW_ONEVALUE Dim lpOneValue As Long Dim tImageLayout As TW_IMAGELAYOUT Dim lRtn As Long On Local Error GoTo ErrPlace '---------------------------------------- ' Get ICAP_PHYSICALWIDTH into TW_ONEVALUE '---------------------------------------- tCapability.ConType = TWON_ONEVALUE tCapability.Cap = ICAP_PHYSICALWIDTH lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_GET, tCapability) If lRtn Then GoTo ErrPlace lpOneValue = GlobalLock(tCapability.hContainer) Call CopyMemory(VarPtr(tOneValueWidth), lpOneValue, Len(tOneValueWidth)) lRtn = GlobalUnlock(tCapability.hContainer) lRtn = GlobalFree(tCapability.hContainer) '----------------------------------------- ' Get ICAP_PHYSICALHEIGHT into TW_ONEVALUE '----------------------------------------- tCapability.ConType = TWON_ONEVALUE tCapability.Cap = ICAP_PHYSICALHEIGHT lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_GET, tCapability) If lRtn Then GoTo ErrPlace lpOneValue = GlobalLock(tCapability.hContainer) Call CopyMemory(VarPtr(tOneValueHeight), lpOneValue, Len(tOneValueHeight)) lRtn = GlobalUnlock(tCapability.hContainer) lRtn = GlobalFree(tCapability.hContainer) '---------- ' Set frame '---------- Call CopyMemory(VarPtr(tImageLayout.Frame.Right), VarPtr(tOneValueWidth.Item1), 4&) Call CopyMemory(VarPtr(tImageLayout.Frame.Bottom), VarPtr(tOneValueHeight.Item1), 4&) lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_IMAGE, DAT_IMAGELAYOUT, MSG_SET, tImageLayout) If ((lRtn) And (lRtn <> 2)) Then GoTo ErrPlace SetMaxImageSize = 0 Exit Function ErrPlace: SetMaxImageSize = 1 End Function Private Function SetResolution(ByVal iRes As Integer) As Long Dim tCapability As TW_CAPABILITY Dim tOneValue As TW_ONEVALUE Dim lhOneValue As Long Dim lpOneValue As Long Dim lRtn As Long On Local Error GoTo ErrPlace tCapability.ConType = TWON_ONEVALUE tCapability.Cap = ICAP_XRESOLUTION '----------------------- ' tCapability.hContainer '----------------------- tOneValue.ItemType = TWTY_FIX32 tOneValue.Item1 = iRes lhOneValue = GlobalAlloc(GHND, Len(tOneValue)) lpOneValue = GlobalLock(lhOneValue) Call CopyMemory(lpOneValue, VarPtr(tOneValue), Len(tOneValue)) lRtn = GlobalUnlock(lhOneValue) tCapability.hContainer = lhOneValue '------------ ' XResolution '------------ lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_SET, tCapability) If lRtn Then lRtn = GlobalFree(lhOneValue) GoTo ErrPlace End If lRtn = GlobalFree(lhOneValue) Call ZeroMemory(VarPtr(tCapability), Len(tCapability)) tCapability.ConType = TWON_ONEVALUE tCapability.Cap = ICAP_YRESOLUTION '----------------------- ' tCapability.hContainer '----------------------- tOneValue.ItemType = TWTY_FIX32 tOneValue.Item1 = iRes lhOneValue = GlobalAlloc(GHND, Len(tOneValue)) lpOneValue = GlobalLock(lhOneValue) Call CopyMemory(lpOneValue, VarPtr(tOneValue), Len(tOneValue)) lRtn = GlobalUnlock(lhOneValue) tCapability.hContainer = lhOneValue '------------ ' YResolution '------------ lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_CAPABILITY, MSG_SET, tCapability) If lRtn Then lRtn = Gl With lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, tUI) If lRtn Then GoTo ErrPlace While GetMessage(tMSG, 0&, 0&, 0&) Call ZeroMemory(VarPtr(tEvent), Len(tEvent)) tEvent.pEvent = VarPtr(tMSG) lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, tEvent) Select Case tEvent.TWMessage Case MSG_XFERREADY GoTo MSGGET Case MSG_CLOSEDSREQ GoTo MSGDISABLEDS End Select lRtn = TranslateMessage(tMSG) lRtn = DispatchMessage(tMSG) Wend MSGGET: lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, lhDIB) If lRtn <> TWRC_XFERDONE Then If lhDIB Then lRtn = GlobalFree(lhDIB) lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, tPending) lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI) GoTo ErrPlace End If lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, tPending) If lRtn Then If lhDIB Then lRtn = GlobalFree(lhDIB) lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI) GoTo ErrPlace End If If SaveDibToFile(lhDIB) Then If lhDIB Then lRtn = GlobalFree(lhDIB) lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI) GoTo ErrPlace End If MSGDISABLEDS: lRtn = DSM_Entry(m_tAppID, m_tSrcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI) If lRtn Then If lhDIB Then lRtn = GlobalFree(lhDIB) GoTo ErrPlace End If Scan = 0 Exit Function ErrPlace: Scan = 1 End Function Private Function SaveDibToFile(ByRef lhDIB As Long) As Long Dim lpDIB As Long Dim tBIH As BITMAPINFOHEADER Dim tBFH As BITMAPFILEHEADER Dim tRGB As RGBQUAD Dim bDIBits() As Byte Dim lDIBSize As Long Dim iFileNum As Integer Dim lRtn As Long On Local Error GoTo ErrPlace If Dir(m_sImageName, vbNormal Or vbReadOnly Or vbHidden Or vbSystem) <> '' Then Call SetAttr(m_sImageName, vbNormal) Call Kill(m_sImageName) End If lpDIB = GlobalLock(lhDIB) If lpDIB = 0 Then GoTo ErrPlace Call CopyMemory(VarPtr(tBIH), lpDIB, Len(tBIH)) Select Case m_ColourType Case BW tBIH.biClrUsed = 2 Case GREY tBIH.biClrUsed = 256 Case RGB tBIH.biClrUsed = 0 End Select lDIBSize = Len(tBIH) + (tBIH.biClrUsed * Len(tRGB)) + _ (((tBIH.biWidth * tBIH.biBitCount + 31) 32) * 4 * tBIH.biHeight) ReDim bDIBits(1 To lDIBSize) As Byte Call CopyMemory(VarPtr(bDIBits(1)), lpDIB, lDIBSize) lRtn = GlobalUnlock(lhDIB) If GlobalFree(lhDIB) = 0 Then lhDIB = 0 With tBFH .bfType = 19778 ' 'BM' .bfSize = Len(tBFH) + lDIBSize .bfOffBits = Len(tBFH) + Len(tBIH) + (tBIH.biClrUsed * Len(tRGB)) End With iFileNum = FreeFile Open m_sImageName For Binary As #iFileNum Put #iFileNum, , tBFH Put #iFileNum, , bDIBits() Close #iFileNum SaveDibToFile = 0 Exit Function ErrPlace: SaveDibToFile = 1 End Function
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д