Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Leer Buffer (Pasando de C# a Delphi) (https://www.clubdelphi.com/foros/showthread.php?t=88683)

Panasys 15-07-2015 17:52:49

Leer Buffer (Pasando de C# a Delphi)
 
Buenas gente, paso a contarles que estoy haciendo, mas adelante le puede servir a otro las soluciones que encuentre.

Estoy intentando implementar un sistema de control de barreras a traves de un SDK que trae la placa.

Ahora intento leer el log de eventos en tiempo real

Me dice el manual que en C# accedo asi

Código PHP:

c#:
int ret 0;
int buffersize 256;
byte[] buffer = new byte[256];
ret GetRTLog(href buffer[0], buffersize); 

Bien, yo lo intente implementar asi:

Código Delphi [-]
  public
    { Public declarations }
    param       : pchar;
    Conn        : Integer;
    Buffer      : array[0..256] of byte;
    BufferSize  : Integer;
    LeeBuffer   : Integer;
  end;

var
  Form1: TForm1;
function Connect(Param:pchar):Integer; stdcall; external 'plcommpro.dll';
function GetRTLog(handle: THandle; Buffer: Byte; BufferSize : Integer):Integer; stdcall; external 'plcommpro.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
param := 'protocol=TCP,ipaddress=192.168.1.251,port=4370,timeout=4000,passwd=';
Conn := Connect(Param);
If Conn <> 0 then Showmessage('Conectado, Handle: '+IntToStr(Conn)) else  Showmessage('Fallo');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
LeeBuffer   := 0;
BufferSize := 256;
LeeBuffer  := GetRTLog(Conn, Buffer[0], BufferSize); //GetRTLog Da 0 o mas una vez leido el buffer o negativo si hubo un error
Showmessage('Buffer: '+IntToStr(LeeBuffer));
end;

Me da un Access Violation de la DLL.

La conexion la hace ok, la dll funciona ok ya que accedo a otras funciones.

Seguro que leo mal el buffer o lo declaro mal para este caso, espero algun hilo amigos, gracias, abrazo.

Javier

escafandra 15-07-2015 18:43:38

Trata de definirlo así:
Código Delphi [-]
function GetRTLog(handle: THandle; Buffer: PByte; BufferSize : Integer):Integer; stdcall; external 'plcommpro.dll';
Y usarlo así:
Código Delphi [-]
GetRTLog(Conn, @Buffer[0], BufferSize);

Otra posibilidad:
Código Delphi [-]
function GetRTLog(handle: THandle; var Buffer: Byte; BufferSize : Integer):Integer; stdcall; external 'plcommpro.dll';
Y usarlo así:
Código Delphi [-]
GetRTLog(Conn, Buffer[0], BufferSize);


Saludos.

Panasys 15-07-2015 21:08:17

escafandra muchas gracias, funciona y me dice en entero cuanto leido, pero no obtengo los datos que se supone deberia obtener.

Algo que no mencione es que en el manual dice:

Código:

[Function]
int GetRTLog(HANDLE handle,char *Buffer, int BufferSize)

Yo pase todo a byte por tratarlo como un buffer, pero la descripcion de la funcion es esa, si yo paso las variables a pchar no funciona.

Deberia tener datos cargados en el arreglo, pero veo datos que no me sirven, demasiados cortos o con faltantes, podrias orientarme con ese char que aparece en la funcion, ya que aparece con un asterico.

Gracias

Javier

escafandra 16-07-2015 01:48:40

El asterisco indica que es un puntero. *char es un PCHAR.

Para pasar un buffer tipo array debes pasar un pontero al primer elemento: @buffer[0]


Saludos.


La franja horaria es GMT +2. Ahora son las 18:38:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi