Power Builder - Ayuda Copiar en Memoria...

 
Vista:
sin imagen de perfil

Ayuda Copiar en Memoria...

Publicado por Frank P. (50 intervenciones) el 25/09/2013 16:10:33
Buen Día con todos, nuevamente aquí consultando su ayuda en este nuevo caso, resulta que estoy trabajando con un OCX el cual esta en VB6, al momento de pasarlo a PB 10.5 me han surgido inconvenientes con respecto a a las líneas de código que son las siguientes:

Private Sub S35TPC1_OnReceiveEvent(ByVal M_No As Long, ByVal evType As Long, evData As Long, ByVal evTr As Long, ByVal evAct As Long, ByVal evTime As Long)
Dim sz As String
Dim szType As String
Dim szIpAddr As String
szIpAddr = LongIP2Dotted(M_No)
Dim strData As String
Dim strByte(IDNUMBER_LENGTH - 1) As Byte.........................(1)
If evType = 1 Or evType = 3 Then
CopyMemory strByte(0), evData, 20..........................................................................(2)
strData = Val(StrConv(strByte, vbUnicode)).............................................................(3)
End If

szType = "UNKNOWN"



(1) en este caso están asignando un tamaño al array strByte, pero según tengo entendido a los arrays en PB no se les asigna una longitud o son variables; por tanto he obviado esa parte.

(2) Tengo problemas al ejecutar esta API de windows, según veo lo que hace es copiar desde un long a un array de tipo byte, y lo que he leído indica que se tiene que colocar el array en la posición inicial
la función declarada en VB6 es:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

y en power lo coloco así:

Subroutine CopyMemory(any Destination, any Source, long Length) Library "kernel32.dll" Alias for "RtlMoveMemory"

(3) En este caso lo que entiendo es que transforma esos bytes del array en una sola cadena de caracteres; para lo cual en la red encontré una función:

//function wf_byte2string(byte ba_source[]) returns string
blob b_destination
string s_destination, f_fullname = "d:\mytemp.txt"
int f_i
ulong hfile, hwrite, hread, ba_len, flen, blen

FileDelete(f_fullname) //delete old file and create a new
f_i = FileOpen(f_fullname, StreamMode!, Write!)
fileClose(f_i)

ba_len = upperbound(ba_source)

hfile = lopen(f_fullname, 1) //write the byte array to temp file
hwrite = lwrite_ba(hFile, ba_source, ba_len)
lclose(hfile)

f_i = FileOpen(f_fullname, StreamMode!)
FileRead(f_i, b_destination) //for large blobs add code to read in parts
FileClose(f_i)

blen = len(b_destination)

s_destination = string(b_destination)
return s_destination

Lo que más me urge es la utilización del API CopyMemory, espero poder contar con su ayuda.

Saludos,

Frank P.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

Ayuda Copiar en Memoria...

Publicado por JeinnerH (646 intervenciones) el 25/09/2013 19:16:23
Y qué es exactament lo que quieres hacer con este código? Cuál es la idea general?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Copiar en Memoria...

Publicado por Frank P. (50 intervenciones) el 25/09/2013 21:22:14
Bueno, en sí, se desea obtener los datos que estan registrados en un equipo biométrico, todo ese código es para obtener los datos y transformarlos a string y mostrarlos como deberia de ser....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

Ayuda Copiar en Memoria...

Publicado por Jeinner (646 intervenciones) el 25/09/2013 21:33:04
Mira esta página a ver si te sirve como ejemplo de cómo se ejecuta en Powerbuilder:
http://infocenter.sybase.com/archive/index.jsp?topic=/com.sybase.dc00586_1110/html/dplynet/dplynet148.htm
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

Ayuda Copiar en Memoria...

Publicado por Jeinner (646 intervenciones) el 25/09/2013 21:39:06
Ayudarte va a estar difícil, porque tendría que montar una simulación para ver cómo funciona la función, y no tengo el equipo adecuado. Así que las opciones son:
1. Intentas con una mezcla de programas para realizar la interface. Si ya te funciona en VB, pues puedes dejar la recepción de la información ahí y que este envíe la información por ejemplo a la base de datos y de ahí la capturas en PB.

2. Investigar mucho en la red y buscar ejemplos, con muchas pruebas de por medio.

3. Algunos equipos simulan la recepción de información como si fuera de teclado, no sé si has intentado con una ventana y un campo de lectura, en ese momento envías una cadena del equipo biométrico, qué pasa, si se llena el campo solo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Copiar en Memoria...

Publicado por Frank P. (50 intervenciones) el 26/09/2013 21:45:28
Hola, bueno he encontrado una solución alterna, simplemente he creado una librería que hace el llamado a la API CopyMemory y a la vez la transformación del array strByte en String, pero ahora surgió otro problema, que quizás resulte algo simple, lo que pasa que al momento de recibir la marcación del biométrico en el PB; todos los parámetros que indiqué son de tipo Long; pero al momento de recibir el parámetro evData, surge el problema debido a que no lo pasa completo a la librería; es decir; la librería me debería devolver 45456710 pero al momento de ejecutarlo sólo me devuelve 4545; estoy seguro que no es error de la libreria debido a que lo he probado en otra aplicación de vb6 que devuelve de manera normal, el problema está en al captura o el envío de esa variable LONG.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

Ayuda Copiar en Memoria...

Publicado por JeinnerH (646 intervenciones) el 26/09/2013 22:13:43
Lo primero sería asegurarte que en la librería que hiciste está enviando de forma correcta el parámetro. Puedes ponerle un Message o hacer que se salbe la información a un archivo de texto.

Lo segundo sería modificar la variable en la que recibes los datos, puedes intentar recibirla en un String, a ver cómo resuta.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Copiar en Memoria...

Publicado por Frank P. (50 intervenciones) el 27/09/2013 16:37:46
Bueno, haciendo pruebas, he visto que el powerbuilder no envía de manera correcta el parámetro para la librería por tal motivo que me devuelve sólo parte del código (4545 cuando debería ser 45456710); los datos que envía el biométrico son de tipo long y uno de ellos (evData) es que contiene el código de personal; lo que me parece raro es que otro dato (evTime) que tiene en long los segundos también los paso a la librería para que me devuelve la fecha y lo hace sin error alguno, mi problema está en el parámetro de evData que no me devuelve el código completo; pensé que quizás las longitudes de long de PB como VB6 son diferentes, pero buscando por la web, vi que son iguales,
ahora voy a probar lo que me dices lo del string a ver que tal, y gracias por tu apoyo.

Saludos,

Frank P.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Copiar en Memoria...

Publicado por Frank P. (50 intervenciones) el 28/09/2013 18:39:35
Bueno, aquí con malas noticias, he probado convirtiendo los tipos de datos, y los errores son mayores aún xD; también he estado buscando en la web problemas similares y encontré en esta misma una publicación del año 2008 donde el problema es con una librería con parámetros de tipo Long y pues no le dan resultado alguno a ese problema, luego buscando más encontré quizás el posible problema:

MICROSOFT...............PB(32Bit)
Bool..............................Boolean
Char*............................Ref String
Colorref........................Ulong
Dword...........................Ulong
Handle.........................Ulong
Hdc...............................Ulong
Hfile..............................Ulong
Hinstance....................Ulong
Hwnd...........................Ulong
Int..................................Int
Lparam........................Ulong
Lpbyte..........................Ref Long
Lpdword......................Ref Ulong
Lpfiletime....................Ref Time
Lpint.............................Ref Long
Lpstr,Lpststr...............Ref String
Lpvoid..........................Ref Struct struct_inst
Mcierror.......................Long
Lpstr,Lpststr...............Ref String
Lpvoid..........................Ref Struct struct_inst
Pbyte............................Ref Long[#]
Short............................Int
Structure.....................Ref Struct Struct_inst
Uint..............................Uint
Void**..........................SUBROUTINE
Word............................Ulong
Wparam......................Ulong

esa es una lista de los tipos de datos equivalentes entre las librerías de Windows y PB, y pues según me indica los tipo Long no tienen una equivalente en PB, ojalá alguien más pueda interesarse en este problema y ayudarme.

Saludos,

Frank P.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar