Saludos Foxeros!Alguien alguna ves intento usar desde Fox Twain_32.DLL que viene con Windows para escanear desde controladores twain. Yo escaneo con WIA la api natural de Windows, pero tengo un caso donde obligado tengo que usar Twain con la opción Duplex, y no quiero usar Dosadi. He armado la estructura para abrir el controlador pero tengo problemas para que muestre el dialogo de escaners disponibles. Me estoy basando en este código que esta en VB. http://lmik.sweb.cz/
--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/abc43e4b-1a26-4df3-bcbc-663c6dda5fce%40googlegroups.com.
Hola ZeRoberto, con Wia si se puede escanear duplex, el asunto es el escaner del cliente no tiene soporte para Wia, solo trabaja con Twain, ya es el 3 caso que me pasa. Estoy intentando usar twain_32.dll directo desde Fox, sin resultados positivo hasta ahora. Le paso la estructura a la función y devuelve positivo, pero al momento de solicitar el dialogo con los dispositivo, devuelve negativo... no veo una sola web donde toque este tema para fox.... esta la alternativa de crear una DLL en C++, por ahora.
El viernes, 25 de octubre de 2019, 22:13:01 (UTC-5), ZeRoberto escribió:
Vas a usar Twain solo por el modo duplex?SaludosZeVFP Unlimited - Canal de Youtube
El vie., 25 de oct. de 2019 a la(s) 13:26, Fernando Mora (servipcco...@gmail.com) escribió:
Saludos Foxeros!--Alguien alguna ves intento usar desde Fox Twain_32.DLL que viene con Windows para escanear desde controladores twain. Yo escaneo con WIA la api natural de Windows, pero tengo un caso donde obligado tengo que usar Twain con la opción Duplex, y no quiero usar Dosadi. He armado la estructura para abrir el controlador pero tengo problemas para que muestre el dialogo de escaners disponibles. Me estoy basando en este código que esta en VB. http://lmik.sweb.cz/
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/abc43e4b-1a26-4df3-bcbc-663c6dda5fce%40googlegroups.com.
--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/d64a3a2f-5d93-4065-bd11-349f48117a22%40googlegroups.com.
#DEFINE FORMAT_MESSAGE_FROM_SYSTEM 0x00001000
#DEFINE DG_CONTROL 1#DEFINE DG_IMAGE 2
#DEFINE MSG_GET 1#DEFINE MSG_SET 6#DEFINE MSG_XFERREADY 257#DEFINE MSG_CLOSEDSREQ 258#DEFINE MSG_OPENDSM 769#DEFINE MSG_CLOSEDSM 770#DEFINE MSG_OPENDS 1025#DEFINE MSG_CLOSEDS 1026#DEFINE MSG_USERSELECT 1027#DEFINE MSG_DISABLEDS 1281#DEFINE MSG_ENABLEDS 1282#DEFINE MSG_PROCESSEVENT 1537#DEFINE MSG_ENDXFER 1793
#DEFINE DAT_CAPABILITY 1#DEFINE DAT_EVENT 2#DEFINE DAT_IDENTITY 3#DEFINE DAT_PARENT 4#DEFINE DAT_PENDINGXFERS 5#DEFINE DAT_USERINTERFACE 9#DEFINE DAT_IMAGELAYOUT 258#DEFINE DAT_IMAGENATIVEXFER 260
#DEFINE TWRC_SUCCESS 0#DEFINE TWRC_CHECKSTATUS 2#DEFINE TWRC_DSEVENT 4#DEFINE TWRC_NOTDSEVENT 5#DEFINE TWRC_XFERDONE 6
#DEFINE TWLG_CZECH 45#DEFINE TWLG_SPANISH_MODERN 83
#DEFINE TWCY_CZECHOSLOVAKIA 42#DEFINE TWCY_ECUADOR 593
#DEFINE TWON_PROTOCOLMAJOR 1#DEFINE TWON_ONEVALUE 5#DEFINE TWON_PROTOCOLMINOR 9
DECLARE LONG DSM_Entry IN TWAIN_32; LONG pOrigin,; LONG pDest,; LONG DG,; LONG DAT,; LONG MSG,; LONG @pData
DECLARE INTEGER GetLastError IN Kernel32
DECLARE INTEGER FormatMessage IN Kernel32; INTEGER dwFlags, ; STRING @lpSource, ; INTEGER dwMessageId, ; INTEGER dwLanguageId, ; STRING @lpBuffer, ; INTEGER nSize, ; INTEGER Arguments
pDest = SPACE(0)m_tSrcID = SetStruct_TW_IDENTITY()pManufacturer = GetHeapAlloc(STRCONV("MoraFer"+CHR(0),5))pProductFamily = GetHeapAlloc(STRCONV("VFP Module"+CHR(0),5))pProductName = GetHeapAlloc(STRCONV("VFP Module for TWAIN"+CHR(0),5))tbVersion = SetStruct_TW_VERSION(1, 0, TWLG_SPANISH_MODERN, TWCY_ECUADOR, 0)m_tAppID = SetStruct_TW_IDENTITY(0, tbVersion, TWON_PROTOCOLMAJOR, TWON_PROTOCOLMINOR, DG_CONTROL, DG_IMAGE, pManufacturer, pProductFamily, pProductName)p_tAppID = GetHeapAlloc(m_tAppID)p_ZeroPtr = 0p_SrcID = GetHeapAlloc(m_tSrcID)
*SET STEP ON? OpenTwainDSM(p_tAppID, p_ZeroPtr)? PopupSelectSourceDialog(p_tAppID, p_ZeroPtr, p_SrcID)? CloseTwainDSM(p_tAppID, p_ZeroPtr)? GetHeapFree()
PROCEDURE OpenTwainDSM() LPARAMETERS tpAppID AS Long, tpZero AS Long nRes0 = DSM_Entry(tpAppID, tpZero, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, _SCREEN.HWnd) IF nRes0#0 GetMensajeError(nRes0) ENDIF RETURN nRes0ENDPROC
PROCEDURE CloseTwainDSM() LPARAMETERS tpAppID AS String, tpZero AS Long nRes3 = DSM_Entry(tpAppID, tpZero, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, _SCREEN.HWnd) RETURN nRes3ENDPROC
PROCEDURE PopupSelectSourceDialog() LPARAMETERS tpAppID AS Long, tpZero AS Long, tpSrcID AS Long nRes2 = DSM_Entry(tpAppID, tpZero, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, tpSrcID) RETURN nRes2ENDPROC
PROCEDURE SetStruct_TW_VERSION() LPARAMETERS tnMajorNum AS Long, tnMinorNum AS Long, tnLanguage AS Long, tnCountry AS Long, tnInfo AS Long bMajorNum = BINTOC(IIF(VARTYPE(tnMajorNum)="N", tnMajorNum, 0), "2RS") bMinorNum = BINTOC(IIF(VARTYPE(tnMinorNum)="N", tnMinorNum, 0), "2RS") bLanguage = BINTOC(IIF(VARTYPE(tnLanguage)="N", tnLanguage, 0), "2RS") bCountry = BINTOC(IIF(VARTYPE(tnCountry)="N", tnCountry, 0), "2RS") bInfo = BINTOC(IIF(VARTYPE(tnInfo)="N", tnInfo, 0), "4RS") TW_VERSION = bMajorNum + bMinorNum + bLanguage + bCountry + bInfo RETURN TW_VERSION ENDPROC
PROCEDURE SetStruct_TW_IDENTITY() LPARAMETERS tnId AS Long, tcVersionStruc AS String, tnProtocolMajor AS Long, tnProtocolMinor AS Long, tnSupportedGroups1 AS Long, ; tnSupportedGroups2 AS Long, tnManufacturer AS Long, tnProductFamily AS Long, tnProductName AS Long bId = BINTOC(IIF(VARTYPE(tnId)="N", tnId, 0), "4RS") bVersion = BINTOC(GetHeapAlloc(IIF(VARTYPE(tcVersionStruc)="C", tcVersionStruc, SetStruct_TW_VERSION())), "4RS") bProtocolMajor = BINTOC(IIF(VARTYPE(tnProtocolMajor)="N", tnProtocolMajor, 0), "2RS") bProtocolMinor = BINTOC(IIF(VARTYPE(tnProtocolMinor)="N", tnProtocolMinor, 0), "2RS") bSupportedGroups1 = BINTOC(IIF(VARTYPE(tnSupportedGroups1)="N", tnSupportedGroups1, 0), "4RS") bSupportedGroups2 = BINTOC(IIF(VARTYPE(tnSupportedGroups2)="N", tnSupportedGroups2, 0), "4RS") bManufacturer = BINTOC(IIF(VARTYPE(tnManufacturer)="N", tnManufacturer, 0), "4RS") bProductFamily = BINTOC(IIF(VARTYPE(tnProductFamily)="N", tnProductFamily, 0), "4RS") bProductName = BINTOC(IIF(VARTYPE(tnProductName)="N", tnProductName, 0), "4RS") TW_IDENTITY = bId + bVersion + bProtocolMajor + bProtocolMinor + bSupportedGroups1 + bSupportedGroups2 + bManufacturer + bProductFamily + bProductName RETURN TW_IDENTITY ENDPROC
PROCEDURE GetHeapAlloc() LPARAMETERS tcStrToPint AS String *----- Declarations APIS DECLARE LONG GetProcessHeap IN Kernel32
DECLARE LONG HeapAlloc IN Kernel32; LONG hHeap,; LONG dwFlags,; LONG dwBytes
DECLARE RtlMoveMemory IN Kernel32; LONG Destination,; STRING @Source,; LONG Length *----- Creamos puntero y colocamos datos tpAddressMem = HeapAlloc(GetProcessHeap(), 0, LEN(tcStrToPint)) RtlMoveMemory(tpAddressMem, @tcStrToPint, LEN(tcStrToPint)) WITH _SCREEN IF VARTYPE(.ArrayPointer)=="U" .AddProperty("ArrayPointer(1,2)") nLenMat=ALEN(.ArrayPointer,1) ELSE nLenMat=ALEN(.ArrayPointer,1)+1 DIMENSION .ArrayPointer(nLenMat,2) ENDIF .ArrayPointer(nLenMat,1) = tpAddressMem .ArrayPointer(nLenMat,2) = LEN(tcStrToPint) ENDWITH CLEAR DLLS GetProcessHeap, HeapAlloc, RtlMoveMemory RETURN tpAddressMemENDPROC
PROCEDURE GetHeapFree() *----- Declarations APIS DECLARE LONG GetProcessHeap IN Kernel32
DECLARE LONG HeapReAlloc IN Kernel32; LONG hHeap,; LONG dwFlags,; LONG lpMem,; LONG dwBytes
DECLARE RtlMoveMemory IN Kernel32; LONG Destination,; STRING @Source,; LONG Length
DECLARE LONG HeapFree IN Kernel32; LONG hHeap,; LONG dwFlags,; LONG lpMem *----- Vaciamos, reducimos y liberamos punteros de memoria WITH _SCREEN IF VARTYPE(.ArrayPointer)#"U" FOR H = 1 TO ALEN(.ArrayPointer,1) nPointAddress = .ArrayPointer(H, 1) nLenPointer = .ArrayPointer(H, 2) cReplicate = REPLICATE(" ", nLenPointer) RtlMoveMemory(nPointAddress, @cReplicate, nLenPointer) HeapReAlloc(GetProcessHeap(), 0x00000004, .ArrayPointer(H), 1) HeapFree(GetProcessHeap(), 0, .ArrayPointer(H)) NEXT REMOVEPROPERTY(_SCREEN, "ArrayPointer") RELEASE ArrayPointer ENDIF ENDWITH CLEAR DLLS GetProcessHeap, HeapReAlloc, RtlMoveMemory, HeapFree, GetStrLenAENDPROC
PROCEDURE GetMensajeError() LPARAMETERS tnError AS Long lnErrorCode = tnError lpBuffer = SPACE(128) =FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 'WINERROR.H', lnErrorCode, 0, @lpBuffer, 128 , 0) =MESSAGEBOX(lpBuffer, 16, "Error: " + TRANSFORM(lnErrorCode,"@0"))ENDPROC
Aquí una captura del código ejecutando y mostrando los controladores twain instalados en el equipo.

Aquí una captura del código ejecutando y mostrando los controladores twain instalados en el equipo.
--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/e80280c1-7fcc-4ca7-94f1-52e7ccd0e5ec%40googlegroups.com.


--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/9b795e18-bea8-473f-bd6a-8bf16013b460%40googlegroups.com.
WITH THIS bReturn = .F. tcPending = .Struct1.Tw_Pending_XFers1.Get() .Struct1.Tw_UserInterface1.tn_ShowUI = .tn_ShowUI .Struct1.Tw_UserInterface1.tn_ModalUI = .tn_ModalUI tUI = .Struct1.Tw_UserInterface1.Get() nResA = 1 nResA = .TwainDSM1.DSM_Entry(.tp_AppID, .tp_SourceID, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, tUI) IF nResA=0 cMSG = .Struct1.Tw_Msg1.Get() pMSG = .GetHeapAlloc(cMSG) .Struct1.Tw_Event1.tn_Event = pMSG tcEvent = .Struct1.Tw_Event1.Get() nCont = 0 DO WHILE .GetMessage(pMSG, 0, 0, 0)#0 nCont = nCont + 1 nResB = 1 nResB = .TwainDSM1.DSM_Entry(.tp_AppID, .tp_SourceID, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, tcEvent) .Struct1.Tw_Event1.Set(tcEvent) lbMSG = SYS(2600, pMSG, 24) .Struct1.Tw_Msg1.Set(lbMSG) DO CASE CASE .Struct1.Tw_Event1.tn_TwMessage=MSG_XFERREADY EXIT CASE .Struct1.Tw_Event1.tn_TwMessage=MSG_CLOSEDSREQ EXIT CASE nResB=1 OR nResB=4 EXIT CASE nResB=5 AND nCont>20 iBool = .Sleep(1000) ENDCASE ENDDO lhDIB = BINTOC(0, "4RS") nRespC = 1 IF nResB#1 nRespC = .TwainDSM1.DSM_Entry(.tp_AppID, .tp_SourceID, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, @lhDIB) ENDIF IF nRespC<>TWRC_XFERDONE nRespD = .TwainDSM1.DSM_Entry(.tp_AppID, .tp_SourceID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, tcPending) ENDIF hFileScan = CTOBIN(lhDIB, "4RS") IF hFileScan>0 .GetImagenSave(hFileScan) bReturn = .T. ENDIF ENDIF nRespE = .TwainDSM1.DSM_Entry(.tp_AppID, .tp_SourceID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, tUI)ENDWITHRETURN bReturn
Excelente, yo moriría en el intento.
El jue., 31 de octubre de 2019 0:03, Fernando Mora <servipcco...@gmail.com> escribió:
Hola Luis Marìa.--Conecte una cámara web y este código la detecto sin problemas. El código recién lo estoy armando, he descubierto que la estructuras de Twain son un poco diferente a las clásicas estructuras de windows. Recién estoy estudiando el comportamiento de los controladores y como pasar los datos a la api, aún no obtengo ni una imagen.Adjunto dos capturas, una de la cámara web detectada y otra de las características de los cadenas de las estructuras que usa twain.
El miércoles, 30 de octubre de 2019, 9:47:47 (UTC-5), Luis Maria Guayan escribió:Muy bueno Fernando, tendrias un código para seleccionar cámaras web instaladas en el equipo?Saludos,Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com
El miércoles, 30 de octubre de 2019, 2:48:38 (UTC-3), Fernando Mora escribió:Aquí una captura del código ejecutando y mostrando los controladores twain instalados en el equipo.
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/4abf90d6-cb12-4c4c-8a42-92ec97060cb9%40googlegroups.com.