Ir al contenido


Foto

[RESUELTO] Conversión de C++ a Delphi


  • Por favor identifícate para responder
23 respuestas en este tema

#1 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 24 marzo 2011 - 01:07

Hola Amigos
Un favor estory tratando de convertir este codigo de C++ en Delphi, pero al momento de generarlo tengo problemas para idetificar el lector biometrico V-Station G4, y no encuentro en donde pueda estar mal.

Se los voy a gradecer mucho si me pudieran ayudar. Gracias

HUNIT BII_Open_TCPIP_Unit_MT(char* host, unsigned short port, int connTimeout, int
*err)

Y yo lo gnere de la siguiente forma:



delphi
  1. function BII_Open_TCPIP_Unit_MT(host:Pchar; port: ushort ;
  2.   connTimeout: integer ; err: int) : HUNIT ; stdcall; external 'VSeries.dll' name 'BII_Open_TCPIP_Unit_MT';
  3.  
  4. unit L1;
  5. interface
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, StdCtrls, Shellapi, BIIDefines, BIItypes, BIIMTFuntionsBasic;
  9. type
  10.   TFL1 = class(TForm)
  11.     Button1: TButton;
  12.     Button2: TButton;
  13.     procedure Button1Click(Sender: TObject);
  14.     procedure Button2Click(Sender: TObject);
  15.   private
  16.   m_pUnitHandle: HUNIT;
  17.   m_UnitType: BII_Unit_Type;
  18.   m_nFingerDataFormat, m_nCommunicationType, m_nSerialPort, m_nBaudRate, m_nDeviceID: Integer;
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   nResult, TCPIP_Port, TCPIP_Timeout: Integer;
  23. m_bIsCommunicationEstablished, m_bIsCommPortOpen, m_bIsCurrentPortEnabled,
  24. m_bIsAutoFingerDetectDisabled: Boolean;
  25.   m_strIPADdress: pchar;
  26.   cIPAddress: array[0..20-1] of char;
  27.   //cIPAddress: string[20];
  28.   end;
  29. var
  30.   FL1: TFL1;
  31. implementation
  32. {$R *.dfm}
  33. procedure TFL1.Button1Click(Sender: TObject);
  34. var
  35.   TotalEntries, ALL_TRANSACTIONS: Integer;
  36. begin
  37.   ALL_TRANSACTIONS := 0;
  38.   TCPIP_Port:= 10001;
  39.   TCPIP_TIMEOUT:= 1000;
  40. //m_pUnitHandle := null;
  41. m_bIsCommunicationEstablished := FALSE;
  42. m_bIsCommPortOpen := FALSE;
  43. m_bIsCurrentPortEnabled := FALSE;
  44. m_bIsAutoFingerDetectDisabled := FALSE;
  45. m_nCommunicationType := 1;
  46. m_nSerialPort := 1;
  47. m_nBaudRate := 115200;
  48. m_nDeviceID := 0;
  49. //m_strIPADdress := '0.0.0.0';
  50.   nResult := 0;
  51. // BOOL bSuccess = TRUE;
  52. FillChar(&m_UnitType, 0, SizeOf(m_UnitType));
  53. // CloseCommunication();            // close existing communication
  54. if (m_nCommunicationType = 1) then
  55.     // Ethernet
  56.   m_strIPADdress := '10.10.10.5';
  57.     StrCopy(cIPAddress, m_strIPADdress);
  58.     m_pUnitHandle := BII_Open_TCPIP_Unit_MT(cIPaddress, TCPIP_PORT, TCPIP_TIMEOUT, &nResult);
  59.   Showmessage('Resultado de m_pUnitHandle: '+inttostr(m_pUnithandle));
  60.   if (nResult < 0) then begin
  61.     Showmessage('Error 1:'+inttostr(nResult));  // y El resultado siempre meda -10006 BII_ERR_INVALID_UNIT_HANDLE    m_bIsCommunicationEstablished := FALSE;
  62.   end
  63.   else begin
  64.     m_bIsCommunicationEstablished := TRUE;
  65.     nResult := BII_Status_MT(m_pUnitHandle) ;
  66.     if nResult > 0 then begin
  67.         ShowMessage('Dentro del Estatus de la Unidad'+inttostr(nResult));
  68.     end ;
  69.     //        ' Determina el total de todas las transacciones
  70.     TotalEntries := BII_Get_Num_Transaction_Log_MT(m_pUnitHandle, ALL_TRANSACTIONS);
  71.     showmessage('Total Mensajes: '+inttostr(TotalEntries));
  72.   nResult := BII_Set_Current_NetID_MT(m_pUnitHandle, m_nDeviceID);
  73.   if (nResult < 0) then begin
  74.     Showmessage('Error 2:'+inttostr(nResult));
  75.     m_bIsCommunicationEstablished := FALSE;
  76.     end
  77.   end;
  78.   if (m_bIsCommunicationEstablished) then begin
  79.     ShowMessage('Communication was established successfully.');
  80.     nResult := BII_Get_Unit_Type_MT(m_pUnitHandle, m_UnitType); // get product type of device
  81.     nResult := BII_Get_Finger_Data_Format_MT(m_pUnitHandle);  // get template format used of device
  82.     if (nResult > 0) then begin
  83.         m_nFingerDataFormat := nResult;
  84.       end;
  85.   end;
  86. end;


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 marzo 2011 - 02:37

Por partes.

El tipo HUNIT no es un tipo básico ce C/C++, por lo que debe estar definido antes en un archivo.h. En ocasiones puede referirse incluso al modo como se pasan los parámetros stdcall o cdecl    que son los modificadores mas comunes en C

El tipo int* es un Pinteger.

No sabemos como se están pasando los parámetros (Calling Convention). El modo por defecto del C/C++ es cdecl    si no se especifica nada.

Así las cosas, la declaración de la función puede ser así:


delphi
  1. function BII_Open_TCPIP_Unit_MT(host:Pchar; port: ushort; connTimeout: integer; err: Pinteger): HUNIT; cdecl; external 'VSeries.dll' name 'BII_Open_TCPIP_Unit_MT';



Los compiladores de C/C++ pueden cambiar la convención de llamada por defecto con una directiva de compilación, así que deberás documentarte de la convención utilizada. En muchas ocasiones se usa stdcall cuando las librerías se van a usar con otros lenguajes o forman parte de una API, si este fuera el caso, tu función deberá declararse así:



delphi
  1. function BII_Open_TCPIP_Unit_MT(host:Pchar; port: ushort; connTimeout: integer; err: Pinteger): HUNIT; stdcall; external 'VSeries.dll' name 'BII_Open_TCPIP_Unit_MT';



Un error en la convención de llamadas genera un error en el código por corrupción de la pila, por lo que será identificable fácilmente.



Saludos.
  • 0

#3 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 24 marzo 2011 - 05:22

La Variable HUNIT la tengo definida en un Archiv BIIDefines, de la siguiente forma:

Type
  HUNIT = Thandle;

Y Si me faltaba definir el Pinteger, ya por lo menos si me saca ya otro mensaje de que el  Error opening socket y si de echo es una API, voy a seguir intentando determinar ese error que me saca.

Gracias de antemano
  • 0

#4 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 25 marzo 2011 - 01:04

Hola Amigos Como interpretqarian ustedes esta funcion:

BII_Open_TCPIP_Unit_MT

HUNIT BII_Open_TCPIP_Unit_MT(char* host, unsigned short port, int connTimeout, int
*err)

Description:

Establishes a TCP connection to a host (V-Station). This function, despite the name, can establish

both a TCP connection to a single unit. A TCP connection will be a reliable two-way connection

much like a serial connection.

[/size]

Parameters:

*host A pointer to an array of char containing the name of the host machine to

establish a TCP connection to, in the form of a dotted IP address

(“10.50.60.70”).

port The TCP port to attempt to connect on. For TCP this should be 10001. Future

versions of V-Station may allow other ports.

connTimeout Parameter included in Multithreaded DLL, here need to pass the timeout and up

to the given timeout connection request is waiting in a given timeout if

connection is not established then this API return false.

err Parameter included in Multithreaded DLL, Return the error if exist while

connection.

[/size]

Return Values:

HUNIT Return the not null HUNIT if connection to device is established successfully.

And the returned handle is need to pass in other commands to communicate to

the device


Error An error specified in the error table. See end of chapter for a description.

function BII_Open_TCPIP_Unit_MT(host:Pchar; port: ushort ;
  connTimeout: integer ; err: PInteger) : HUNIT ; stdcall; external
  'VSeries.dll' name 'BII_Open_TCPIP_Unit_MT';

Y la lectura la estoy haciendo de esta forma, pero me marca error opening sockect, como si la direccion estuviera bloqueada, o fuera la incorrecta, siento que me esta faltando algo en la variable m_StrIPAddress, no se si sea el tipo o no se

m_StrIPADddress: Pchar;
m_pUnitHandle, nResult : Integer;
TCPIP_Port := 10001;
TCPIP_Timeout := 1000;

m_strIPADdress := '192.168.0.51';
    m_pUnitHandle := BII_Open_TCPIP_Unit_MT(m_strIPADdress, TCPIP_Port, TCPIP_TIMEOUT, @nResult);
  if (nResult < 0) then begin
    Showmessage('Error 1:'+inttostr(nResult));
    m_bIsCommunicationEstablished := FALSE;

Si me pudieran ayudar con esto se los voy a agradecer. Gracias

  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 marzo 2011 - 01:55

Para manejas los Socket en Windows debes inicializarlos y cerrar al terminar:

Es posible que tu error venga por aquí. La dll que usas, posiblemente tenga implementada alguna función que se encargue de ello, si no es así puedes realizar algo como esto:



delphi
  1. var
  2.   WSA: TWSADATA;
  3. begin
  4.   // Inicializando...
  5.   if(WSAStartup(MakeWord(1,1), WSA) <> 0) then exit;
  6.  
  7. ............................
  8. ............................
  9.  
  10. // Finalizando...
  11.   WSACleanup();
  12. end;



Saludos.
  • 0

#6 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 28 marzo 2011 - 05:19

Hola Ing. Escafandra
Buenas Tardes

Que posibilidades hay de que le envio la dll y el programa que estoy usando para detectar el problema y me pueda ayudar a determinar que es lo que estoy haciendo mal.

  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 29 marzo 2011 - 11:31

El problema está en la escasa disponibilidad de tiempo del que dispongo y la incapacidad de simular el lector biometrico V-Station G4, del que hablas. Puede que el problema esté en la IP:Puerto que usas.

Si tu programa tiene muchas líneas de código, analizarlo levará mucho tiempo. Una función simple si podría tratar de estudiarla, pero con la dificultad de no poder simular tu entorno de trabajo. No puedo prometerte nada.




Saludos.
  • 0

#8 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 29 marzo 2011 - 07:15

Hola Escafandra, te proporciono el codigo, es muy simple



delphi
  1. unit BL1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;
  6. type
  7.   HUNIT = Thandle;
  8. type
  9.   TForm1 = class(TForm)
  10.     Button1: TButton;
  11.     procedure Button1Click(Sender: TObject);
  12.   private
  13.     { Private declarations }
  14.   public
  15.   nResult : integer;
  16.   m_pUnitHandle: HUNIT;
  17.   m_bIsCommunicationEstablished : Boolean;
  18.   m_strIPADdress: pchar;
  19.     { Public declarations }
  20.   end;
  21. function BII_Open_TCPIP_Unit_MT(host:pchar; port: ushort ;
  22.   connTimeout: integer ; err: PInteger) : integer ; stdcall ;
  23.   external 'E:\Sistemas\Proyectos\L1\VSeries.dll' name 'BII_Open_TCPIP_Unit_MT';
  24. var
  25.   Form1: TForm1;
  26. const
  27.   TCPIP_PORT    =  10001 ;
  28.   TCPIP_TIMEOUT  =  1000 ;
  29. implementation
  30. {$R *.dfm}
  31. procedure TForm1.Button1Click(Sender: TObject);
  32. begin
  33. m_pUnitHandle := 0;
  34. m_bIsCommunicationEstablished := FALSE;
  35. m_strIPADdress := '0.0.0.0';
  36.   nResult := 0;
  37.   m_pUnitHandle := BII_Open_TCPIP_Unit_MT('10.10.15.25', TCPIP_PORT, TCPIP_TIMEOUT, @nResult);
  38.   if (nResult < 0) then begin
  39.     Showmessage('Error 1:'+inttostr(nResult));
  40.     m_bIsCommunicationEstablished := FALSE;
  41. end
  42. else begin
  43.     m_bIsCommunicationEstablished := TRUE;
  44.     ShowMessage('Communication was established successfully.') ;
  45.   end;
  46.   end;
  47. end.



Este es el error que me saca  -125 TCP/IP: Error opening socket
  Y te anexo como esta declarado en C++, esta DLL que se utiliza es para trabajar con cualquier lenguaje


[c]Funcion en C++
  typedef HANDLE HUNIT;
  // TCP/IP functions
/********************Functions do not require UNIT Handle *********************/
  HUNIT WINAPI BII_Open_TCPIP_Unit_MT(char* host, unsigned short port, int connTimeout, int *err);[/c]



Como te puedo hacer llegar la dll y la direccion IP publica donde tengo un equipo en linea para pruebas.


En espera de tus comentarios. Saludos y gracias de antemano
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 30 marzo 2011 - 01:36

Hola jjmcira.

He editado tu mensaje para darle el formato adecuado al código. Además, por motivos de seguridad he eliminado tu e-mail a fin de evitarte una orda de spammers. En todo caso debes comunicarte en forma privada con escafandra.

Saludos,
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 30 marzo 2011 - 01:58

Has hecho bien, Delphius.

Por mi parte ya le enviado un  correo a esa dirección que publicó, solo falta que lo lea...

Saludos.

  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 31 marzo 2011 - 06:24

He probado el código en las siguientes condiciones:
- Dirección IP pública que proporcionaste.
- Ruta de VSeries.dll en la misma que el  proyecto y el ejecutable.


El resultado es que conecta perfectamente. Te envío por correo el proyecto.




Saludos.
  • 0

#12 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 04 abril 2011 - 05:04

HOLA
Buenas Tardes ESCAFANDRA

Fijate que ya logre conectarmen  bien, gracias a la ayuda que me proporcionaste, pero ahora tengo el problema de convertir un bloque o puntero de memoria a arreglo de bytes y este a su vez convertir la información en string y obtener los valores necesarios.

He estado trabajando y me marca un error despues de que asignoi en memoria los datos y los paso al array. te proporciono el codigo para solicitarte si me puedes opoyar con esta información. Saludos y gracias de antemano.



delphi
  1. unit L1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, BIITypes, BIIDefines, BIIMTFuntionsBasic, Buttons;
  6. type
  7.   TFL1 = class(TForm)
  8.     Button1: TButton;
  9.     Button2: TButton;
  10.     BitBtn1: TBitBtn;
  11.     procedure Button1Click(Sender: TObject);
  12.     procedure Button2Click(Sender: TObject);
  13.   private
  14.     { Private declarations }
  15.   public
  16.     { Public declarations }
  17.     nResult, m_nCommunicationType, m_nDeviceID, TCPIP_Port, UDPIP_Port,
  18.       TCPIP_Timeout, m_nFingerDataFormat: Integer;
  19.     m_pUnitHandle: HUNIT;
  20.     m_UnitType : BII_Unit_Type;
  21.     m_bIsCommunicationEstablished: Boolean;
  22.     m_strIPADdress: pchar;
  23.     cIPAddress: string[20];
  24.   end;
  25. var
  26.   FL1: TFL1;
  27. implementation
  28. {$R *.dfm}
  29. procedure TFL1.Button1Click(Sender: TObject);
  30. var
  31.   max_datalogs, TotalEntries, MaxEntries, All_Transactions, m_Resul: Integer;
  32.   Manejador_Memoria, IntPtr: PByte;
  33.   m_pUnitHandle: HUNIT;
  34.   buffSizeTotal: integer;
  35.   buffSize1Trans, lStatus, m_NumTransToEvaluate,
  36.   m_NumTransProcessed, m_Result, ASYNC_MODE, I: Integer;
  37.   BII_Transaction: BII_Transaction_Log_Struct;
  38.   rawData: array[0..1000] of Byte ;
  39. begin
  40.   max_datalogs := 500;
  41.   Manejador_Memoria := 0;
  42.   All_Transactions := 0;
  43.   m_pUnitHandle := NULL;
  44.   //
  45.   //*
  46.   TCPIP_Port := 10001;
  47.   UDPIP_Port := 10002;
  48.   TCPIP_Timeout := 1000;
  49.   m_pUnitHandle := 0;
  50.   m_bIsCommunicationEstablished := FALSE;
  51.   m_nCommunicationType := 1;
  52.   m_nDeviceID := 0;
  53.   // m_strIPADdress := '0.0.0.0';
  54.   nResult := 0;
  55.   ASYNC_MODE := 0;
  56.   // BOOL bSuccess = TRUE;
  57.   FillChar(m_UnitType, 0, SizeOf(m_UnitType));
  58.   // CloseCommunication();            // close existing communication
  59.   cIPAddress := '200.67.122.81';
  60.   // StrCopy(cIPAddress, m_strIPADdress);
  61.   m_pUnitHandle := BII_Open_TCPIP_Unit_MT(cIPAddress, 10001, 1000, @nResult);
  62.   // m_pUnitHandle := BII_Open_UDP_Unit_MT(cIPaddress, 10002, @nResult) ;
  63.   if (nResult < 0) then
  64.   begin
  65.     Showmessage('Error 1:' + inttostr(nResult));
  66.     m_bIsCommunicationEstablished := FALSE;
  67.   end
  68.   else
  69.   begin
  70.     m_bIsCommunicationEstablished := TRUE;
  71.     nResult := BII_Set_Current_NetID_MT(m_pUnitHandle, m_nDeviceID);
  72.     if (nResult < 0) then
  73.     begin
  74.       Showmessage('Error 2:' + inttostr(nResult));
  75.       m_bIsCommunicationEstablished := FALSE;
  76.     end
  77.   end;
  78.   if (m_bIsCommunicationEstablished) then
  79.   begin
  80.     Showmessage('Communication was established successfully.');
  81.     nResult := BII_Get_Unit_Type_MT(m_pUnitHandle, m_UnitType); // get product type of device
  82.     nResult := BII_Get_Finger_Data_Format_MT(m_pUnitHandle);  // get template format used of device
  83.     if (nResult > 0) then  begin
  84.     m_nFingerDataFormat := nResult;
  85.     end
  86.     else
  87.       showmessage(inttostr(nresult));
  88.     end ;
  89.   // 0 - All Transactions Log
  90.   // 1 - Only un-read entries
  91.   // 'checa si la terminal no esta Busy
  92.   // '1          The MV1200 is busy.
  93.   // '0          The(MV1200 Is idle)
  94.   // '2          The MV1200 is cleaning up flash
  95.   // 'Error(<0)  An error specified in the error table. See end of chapter for a description.
  96.     nResult := BII_Status_MT(m_pUnitHandle);
  97.     if nResult <> 0 then  begin
  98.         showmessage('Diferente de 0:'+inttostr(nResult));
  99.     end
  100.     else
  101.     begin
  102.         showmessage('No es Diferente de 0:'+inttostr(nResult));
  103.     end;
  104.     // ' Determina el total de todas las transacciones
  105.     TotalEntries := BII_Get_Num_Transaction_Log_MT(m_pUnitHandle, All_Transactions);
  106.     if TotalEntries < 0 then
  107.     begin
  108.       showmessage('No existen Transacciones ...');
  109.     end;
  110.     showmessage('Total de Transacciones: '+inttostr(TotalEntries));
  111.     m_NumTransToEvaluate := -1;
  112.     m_NumTransProcessed := 0;
  113.     buffSize1Trans := SizeOf(BII_Transaction);
  114.     showmessage(inttostr(buffSize1Trans));
  115.     m_Result := 1;
  116.   {While (TotalEntries > 0) And (m_Result > 0) And (nResult = 0) do
  117.   // ' mientras haya checadas y no se tengan errores
  118.   begin
  119.     If TotalEntries > max_datalogs then
  120.     begin
  121.       MaxEntries := max_datalogs;
  122.     end
  123.     else
  124.     begin
  125.       MaxEntries := TotalEntries;
  126.     End;
  127.     TotalEntries := MaxEntries;
  128.     Try}
  129.       // ' calcula el tamaño de todo el buffer de transacciones a bajar
  130.       buffSizeTotal := buffSize1Trans * MaxEntries;
  131.       showmessage(inttostr(buffSizeTotal));
  132.       //    Dim rawData(buffSizeTotal - 1) As Byte
  133.       Manejador_Memoria := allocmem(sizeof(buffSizeTotal)) ;
  134.       //Manejador_Memoria := Marshal.AllocHGlobal(buffSizeTotal) ;
  135.         //    'checa si la terminal no esta Busy
  136.         nResult := BII_Status_MT(m_pUnithandle);
  137.         If nResult = 0 Then
  138.         //  ' baja el buffer y las marca como leidas}
  139.         nResult := BII_Read_Transaction_Log_MT(m_pUnitHandle, ALL_TRANSACTIONS, 1, maxEntries, Manejador_Memoria);
  140.         showmessage('Resultado de Lectura del Log en memoria...'+inttostr(nResult));
  141.         If nResult > 0 Then begin
  142.         //    ' copia el buffer de memoria en un arreglo de bytes
  143.         //Marshal.Copy(Manejador_Memoria, rawData, 0, buffSizeTotal)
  144.         copyMemory(@manejador_memoria, @rawData, length(rawdata)) ;
  145.         //Marshal.FreeHGlobal(Manejador_Memoria)
  146.         freemem(Manejador_Memoria);
  147.         showmessage('Hasta Aqui vamos bien ...');
  148.         //  'por cada una de las transaciones bajadas
  149.         for I := 0 to MaxEntries - 1 do
  150.             Manejador_Memoria = allocmem(buffSize1Trans)
  151.         //toma del arreglo de bytes la porcion correspondiente a la transacciones
  152.         //y lo copia en un buffer de memoria
  153.         //Marshal.Copy(rawData, i * buffSize1Trans, Manejador_Memoria, buffSize1Trans)
  154.         Copymem(rawData, i * buffSize1Trans, Manejador_Memoria, buffSize1Trans)
  155.         BII_Transaction := CType(Marshal.PtrToStructure(Manejador_Memoria, GetType(BII_Transaction_Log_Struct)), cDatalogVF.BII_Transaction_Log_Struct)
  156.         //      '---------------------------------------------------------------------
  157.         //      ' registra la transaccion
  158.         WriteTransacc(BII_Transaction) ;
  159.         //      '---------------------------------------------------------------------
  160.         //(Manejador_Memoria)
  161.         FreeMem(Manejador_Memoria);
  162.         Manejador_Memoria := Zeromemory;
  163.         //Next
  164.         freemem(Manejador_Memoria) ;
  165.         Manejador_Memoria = ZeroMemory;
  166.         End ;
  167.         {End If  'If lStatus = 0 Then
  168.         Catch ex As Exception
  169.         nResult := -99  'Error generico
  170.         Finally
  171.         If Not Manejador_Memoria.Equals(IntPtr.Zero) Then Marshal.FreeHGlobal(Manejador_Memoria)
  172.         Manejador_Memoria = IntPtr.Zero
  173.         End Try}
  174.         //checa si la terminal no esta Busy
  175.         //ONLY_READ_TRANSACTIONS
  176.         nResult := BII_Status_MT(m_pUnitHandle);
  177.         //If (nResult = 0) And (m_Resul > 0 )Then begin
  178.         //                ' borra las transacciones marcadas como ya leidas
  179.         //showmessage('Enrto a Marcar los Logs para ser Borrados');
  180.         //nResult := BII_Erase_Transaction_Log_MT(m_pUnitHandle, 0, ASYNC_MODE) ;
  181.         //End;
  182.         //If nResult <> 0 Then
  183.         //End While
  184.         //        ' Una vez obtenidas todas dispara el evento OnDatalogTransactions avisando que ya termino
  185.         //end
  186.       //
  187.     {Finally
  188.     End;
  189.   end;}
  190. end;
  191. procedure TFL1.Button2Click(Sender: TObject);
  192. begin
  193. // if (m_pUnitHandle <> 0) then
  194. // begin
  195.     BII_Close_Unit_MT(m_pUnitHandle);
  196.     m_pUnitHandle := 0;
  197. // end;
  198. end;


  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 abril 2011 - 07:55

Hola,
jjmcira acabo de editar tu mensaje para darle formato. Para la próxima por favor tómate la molestia de aprender a etiquetarlo. Fíjate que debajo del combo para elegir el color de texto hay una serie de botones, justamente el casos es para etiquetar código Delphi, luego está para C++, C#, SQL y C respectivamente. También puedes hacerlo manualmente escribiendo [ delphi ] y [ /delphi ] sin los espacios.

Saludos,

  • 0

#14 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 abril 2011 - 10:05

Fijate que ya logre conectarmen  bien, gracias a la ayuda que me proporcionaste...

 

...pero ahora tengo el problema de convertir un bloque o puntero de memoria a arreglo de bytes y este a su vez convertir la información en string y obtener los valores necesarios.


Mirando tu código veo que estas usando mal la API CopyMemory, confundes fuente y destino.
Por otro lado si quieres convertir un buffer a un String, una forma directa de hacerlo es:



delphi
  1. var
  2.   s: String;
  3. begin
  4.   SetLength(s, sizebuffer);
  5.   CopyMemory(@s[1], buffer, sizebuffer);
  6. end;





Saludos.

  • 0

#15 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 06 abril 2011 - 01:28

Hola Escafandra

Muchas gracias por la información, pero lo realice asi como me indicaste y al momento de ir generando la conversión no me muestra nada, asin en cambio lo baje a un arreglo de Bytes y asi si me da la información.

Como puedo hacerle para transformar de ese arreglo de bytes a un record y posterior a string.

lo tengo de la siguiente forma:



delphi
  1. type
  2.   BII_Transaction_Log_Struct = record
  3.     id: Cardinal;
  4.     reserved_1: Byte;
  5.     index: Byte;
  6.     year: WORD;
  7.     month: Byte;
  8.     day: Byte;
  9.     hour: Byte;
  10.     min: Byte;
  11.     sec: Byte;
  12.     trans_code: Byte;
  13.     flag_port: Byte;
  14.     trans_log_data_1: Byte;
  15.     trans_log_data_2: Byte;
  16.     trans_log_data_3: Byte;
  17.     reserved_2: Byte;
  18.     status: Byte;
  19.   end;
  20.  
  21. var
  22. rawdata: array[1..10000] of byte;
  23. logs: PByte;
  24. BuffSize1Trans : Integer;
  25. BII_Transaction : BII_Transaction_Log_Struct ;
  26.  
  27.  
  28. begin
  29.  
  30. copyMemory(@rawdata, logs, sizeof(buffSize1Trans))
  31.  
  32. end



En espera de tus comentarios. Saludos y gracias de antemano
  • 0

#16 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 abril 2011 - 02:07

¿Dices que lo cargaste en un array de Bytes correctamente?.
Desconozco la estructura de la información que recibes, pero déjame preguntarte: ¿La estructura  (record) que declaras, es la estructura de los datos que recibes? Si es así la lectura la puedes realizar directamente en ella.




Saludos.
  • 0

#17 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 06 abril 2011 - 03:23

Asi es Escafandra

La estructura que se recibe es identica al Record que te mostre anteriormente, pero no encuentro como descargarla directamente en el record desde el Array.

En espera de tus comentarios Saludos
  • 0

#18 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 abril 2011 - 04:04

La estructura que se recibe es identica al Record que te mostre anteriormente, pero no encuentro como descargarla directamente en el record desde el Array.



Pues es sencillo, en lugar de usar un array para descargarla, usa un puntero a una variable declarada como tu estructura.


Saludos.
  • 0

#19 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 06 abril 2011 - 05:38

Perdon por mi ignorancia escafandra, pero me pudieras propporcionar un ejemplo, te lo voy a gradecer mucho. Saludos y gracias
  • 0

#20 jjmcira

jjmcira

    Member

  • Miembros
  • PipPip
  • 26 mensajes

Escrito 06 abril 2011 - 07:48

Hola Escafandra

Buenas Noches

Fijate que ya logre pasar los datos al Record, pero siempre me maneja el mismo dato, como puedo hacer para que se recorra, ya que si le integro del for me marca que no es array.

Lo tengo de dos formas:



delphi
  1. [i]
  2. var
  3. BII_Transaction: BII_Transaction_Log_MT;
  4. LogDatos: ^BII_Transaction_Log_MT;
  5. MaxEntries: Integer;
  6.  
  7. begin
  8. MaxEntries:= 50;
  9.  
  10.  
  11. for i := 0 to MaxEntries - 1 do
  12. begin
  13.  
  14. Copymemory(@BII_Transaction, Logs, buffSize1Trans);
  15. copyMemory(@LogDatos, @logs, sizeof(Logs))
  16.  
  17. end;
  18.  
  19. [/i]



En espera de tus comentarios. Saludos y gracias de antremano

  • 0




IP.Board spam blocked by CleanTalk.