PDA

Ver la Versión Completa : Leer Buffer (Pasando de C# a Delphi)


Panasys
15-07-2015, 17:52:49
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#:
int ret = 0;
int buffersize = 256;
byte[] buffer = new byte[256];
ret = GetRTLog(h, ref buffer[0], buffersize);


Bien, yo lo intente implementar asi:

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í:
function GetRTLog(handle: THandle; Buffer: PByte; BufferSize : Integer):Integer; stdcall; external 'plcommpro.dll';
Y usarlo así:
GetRTLog(Conn, @Buffer[0], BufferSize);

Otra posibilidad:
function GetRTLog(handle: THandle; var Buffer: Byte; BufferSize : Integer):Integer; stdcall; external 'plcommpro.dll';
Y usarlo así:
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:


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