Fox con Twain_32.DLL api DSM_Entry

629 views
Skip to first unread message

Fernando Mora

unread,
Oct 25, 2019, 2:26:45 PM10/25/19
to Comunidad de Visual Foxpro en Español
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/ 

ZeRoberto

unread,
Oct 25, 2019, 11:13:01 PM10/25/19
to publicesvfoxpro
Vas a usar Twain solo por el modo duplex?

Saludos

Ze




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 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.
Message has been deleted

ZeRoberto

unread,
Oct 27, 2019, 12:21:14 AM10/27/19
to publicesvfoxpro
Yo me descargue este codigo para Escanear pero nunca logre probarlo, y tampoco se si el eztwain.dll tiene para scanear en modo duplex

PROCEDURE Scan()
Local lnHandle, lnReply, lcResult, lcFileName
   Declare Integer TWAIN_AcquireNative In "Eztw32.dll" Integer nAppWind, Integer nPixelTypes
   Declare Integer TWAIN_WriteNativeToFilename In "Eztw32.dll" Integer nDIB, String cFilename
   Declare Integer TWAIN_FreeNative In "Eztw32.dll" Integer nDIB
   Declare Integer TWAIN_SetHideUI In "Eztw32.Dll" Integer
   lcFileName = GetTempFile("jpg")

   TWAIN_SetHideUI(1)
   lnHandle = TWAIN_AcquireNative(_VFP.hWnd, 0)
   lnReply = TWAIN_WriteNativeToFilename(lnHandle, @lcFileName)
   TWAIN_FreeNative(lnHandle)
   
   Clear Dlls "TWAIN_AcquireNative, TWAIN_WriteNativeToFilename, TWAIN_FreeNative, TWAIN_SetHideUI"
   
   lcResult = lcFileName
   If lnReply <> 0
      lcResult = .NULL.
   EndIf
   
Return (lcResult)

Saludos

Ze




El sáb., 26 de oct. de 2019 a la(s) 18:56, Fernando Mora (servipcco...@gmail.com) escribió:

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?

Saludos

Ze




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.

--
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.
Message has been deleted

Fernando Mora

unread,
Oct 27, 2019, 4:09:18 PM10/27/19
to Comunidad de Visual Foxpro en Español
Hola ZeRoberto

Gracias por responder, esa código es para la versión gratuita de Dosadi, no tiene soporte para duplex, con wia se puede escanear duplex sin problema, pero el escaner del cliente no tiene soporte para wia, solo twain. 

Saludos.

Fernando Mora

unread,
Oct 30, 2019, 1:41:01 AM10/30/19
to Comunidad de Visual Foxpro en Español
Saludos Comunidad!

Luego de revisar info en uno y otro lado, descargar varias fuentes de C++, dar vuelva en la web de twain, leer full pdf del tema, logre armar un fragmento de código Fox 100%. Por ahora se logra mostrar la ventana de selección de controladores twain de escaner.... ya es algo. Esto me hace entender que es posible trabajar todo el proceso dentro de Fox, al igual de Wia de windows. Son buenas noticias.

Les comparto el código que hasta el momento he logrado armar; con esta muestra se puede seguir hasta tener todo el proceso de escaneo. Como podrán ver es vital el manejo de punteros de memoria primitivo, esa tarea se facilita enormemente con las funciones GetHeapAlloc, y GetHeadpFree. 

Fernando


#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 = 0
p_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 nRes0
ENDPROC

PROCEDURE CloseTwainDSM()
LPARAMETERS tpAppID AS String, tpZero AS Long
nRes3 = DSM_Entry(tpAppID, tpZero, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, _SCREEN.HWnd)
RETURN nRes3
ENDPROC

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 nRes2
ENDPROC

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 tpAddressMem
ENDPROC

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, GetStrLenA
ENDPROC

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




Fernando Mora

unread,
Oct 30, 2019, 1:48:38 AM10/30/19
to Comunidad de Visual Foxpro en Español

Aquí una captura del código ejecutando y mostrando los controladores twain instalados en el equipo.



TWAIN.jpg

ZeRoberto

unread,
Oct 30, 2019, 1:59:58 AM10/30/19
to publicesvfoxpro
Te recomiendo que lo encapsules en una clase

SAludos
El mié., 30 de oct. de 2019 a la(s) 00:48, Fernando Mora (servipcco...@gmail.com) escribió:

Aquí una captura del código ejecutando y mostrando los controladores twain instalados en el equipo.



TWAIN.jpg

--
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.

Luis Maria Guayan

unread,
Oct 30, 2019, 10:47:47 AM10/30/19
to Comunidad de Visual Foxpro en Español
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

Fernando Mora

unread,
Oct 31, 2019, 1:03:38 AM10/31/19
to Comunidad de Visual Foxpro en Español
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. 

TWAIN2.jpg


TWAIN3.jpg

Fernando Mora

unread,
Nov 1, 2019, 9:13:28 PM11/1/19
to Comunidad de Visual Foxpro en Español
Hola comunidad

Ayer por fin pude hacer funcionar un escaner usando TWAIN desde Fox, la verdad fácil no es, pero tampoco imposible, les hago saber los inconvenientes que se presentaron y que me toco estrenarlos. 
Si tienen Windows de 64bits no use TWAIN_32.DLL es demasiado inestable, usen TWAINDSM.DLL también viene en Windows, y esta dentro de System32 y SysWow. Hacer funcionar el escaner no fue la parte mas difícil, lo complejo es extraer los binarios de la imagen que el escaner coloca en una dirección de memoria. Traducir como se debe leer esa estructura a Fox no fue nada fácil, di vueltas a lo pendejo hasta darme cuenta de como esta armada esa estructura. y calcular como extraer esos bytes.... me costo creer que el archivo pesa mas de 28 millones de bytes. (26 megas). Me tope con que SYS(2600)  solo puede extraer hasta 4000 bytes, luego de eso FALLA.... intente usar RtlMoveMemory de Kernel32, también falla. Al parecer es un problema de Fox. Ya había experimentado eso cuando intente  cifrar archivos enormes, Fox falla para trabajar con punteros con grandes cantidades de bytes. Solucione el problema usando CreateFile, WriteFile y CloseHandle de Kernel32, con WriteFile le pase primero la estructura de la cabecera del archivo BMP y luego la dirección del puntero que entregó el escaner. Para ese tipo de puntero WriteFile exige que le pases el puntero bloqueado, usé GlobalLock para eso.

Ya esta investigado y resuelto el tema, solo queda clasearlo......

Fernando.

Edwin Duran

unread,
Nov 2, 2019, 2:19:46 PM11/2/19
to Comunidad de Visual Foxpro en Español
excelente

Daniel Sánchez

unread,
Nov 3, 2019, 11:31:37 AM11/3/19
to Comunidad de Visual Foxpro en Español
Excelente,  yo moriría en el intento. 

--
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.

Fernando Mora

unread,
Nov 5, 2019, 4:42:14 PM11/5/19
to Comunidad de Visual Foxpro en Español
Saludos Foxeros!

Ya estoy claseando el proyecto FoxTwain. Para escaneado vía código, va excelente, pero para en caso se quiera trabajar con la aplicación original del controlador del escaner tengo un ligero inconveniente. Si no le pongo una pausa al bucle de llamado de mensajes al controlador, no le deja hacer nada al usuario en esa ventana externa de nuestro programa Se me ocurrió colocar un SLEEP de 1 segundo luego de 10 pasos dentro del bucle, para que el usuario tenga chance de manipular la UI del escaner.... ¿alguien tiene una mejor ida? por favor observen el bucle, habrá alguna mejor manera de trabajarlo a esto? el bucle funciona perfecto para cuando no se presenta la UI del escaner y mandamos directo a escanear. En dos pasos ya sale del bucle y procesa la imagen, el problema es en trabajo modo UI.



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)
ENDWITH
RETURN bReturn

 




El domingo, 3 de noviembre de 2019, 11:31:37 (UTC-5), Daniel Sánchez escribió:
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. 

TWAIN2.jpg


TWAIN3.jpg



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.



TWAIN.jpg

--
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.

Daniel Sánchez

unread,
Nov 6, 2019, 1:36:02 PM11/6/19
to Comunidad de Visual Foxpro en Español
Prueba con doevents(), esto hace que dentro del bucle se pueda capturar los eventos del sistema.

Saludos

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.


--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software SAC
Móvil y WhatsApp +051-949398047 / Móvil 948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Francisco

unread,
Jul 20, 2022, 7:32:48 AM7/20/22
to Comunidad de Visual Foxpro en Español
Alguien sabe que fue de la clase  FoxTwain?
Reply all
Reply to author
Forward
0 new messages