Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   puntero *pantalla en c++ (https://www.clubdelphi.com/foros/showthread.php?t=33903)

coletaun 20-07-2006 01:20:19

puntero *pantalla en c++
 
tengo una funcion de c++ que captura una determinada pantalla de un terminal a traves de un dll externa a la cual la llamo sin problemas y el resto de funciones de la libreria las ejecuta sin problema.
El problema empieza cuando intento capturar en esta tipo de variable los caracteres que aparecen en la pantalla del termina, que es otra aplicacion distinta a la de delphi.

La funcion en c se define asi en la dll:

BOOL WINAPI captura_pantalla(HCLIENT hclient, char *pantalla, int *longitud, int tout);
donde hclient es un manejador, char *pantalla es el buffer donde se van a copiar los datos de la pantalla, *longitud la longitud de los datos a copiar y tiout el tiempo de espera de la respuesta.

esta funcion da un true o false si se ejecuta, pero yo la defino en delphi:

function captura_pantalla(HCLIENT: integer; pantalla: string; longitud: integer; tout: integer ):bool; ¿seria esto correcto?

En principio no me funciona, da false y no captura los datos de la pantalla del terminal y el string está vacio.

¿tal vez *buffer, es un puntero de memoria y lo debo de recorrer?, no se como implementar la funcion de c++ y no se is será correcta la variable buffer como string o deberia de emplear otro tipo de variable. Llevo dos semanas trabado en esto y agradeceria mucho cualquier ayuda o comentario, de verdad, muchas gracias,

OSKR 20-07-2006 02:07:21

Hay algo q no tengo claro........en C si te funciona?, otra cosa...no recuerdo muy bien Pascal.....pero tal vez no deberías usar un string sino un puntero genérico o un puntero a un arreglo de Char. Otra cosilla.... el espacio al q apunta pantalla puede ser estático? o lo q sería eqivalente..... reservado por la misma función q la llama? o la función n la dll se encarga de reservarlo...? si fuese esta última tal vez sería mejor un doble puntero o declararlo:
Código:

char *&puntero
para q se pueda modificar el puntero en la función sin hacerlo como doble puntero...valga la redundancia :).

coletaun 20-07-2006 10:43:37

Si en C si que funciona, pero estoy rehaciendo todo el programa en delphi para ampliarlo, pues es que estaba en C++ esta cerrado.
Intento utilizar las librerias definidas en c, para pascal.

Creo que deberia utilizar un puntero generico Pchar, pero ah hacerlo en la funcion me da un error en la dll.
El espacio al que apunta la pantalla es estático.

ppb 20-07-2006 11:28:05

Cita:

Empezado por coletaun
La funcion en c se define asi en la dll:

BOOL WINAPI captura_pantalla(HCLIENT hclient, char *pantalla, int *longitud, int tout);
donde hclient es un manejador, char *pantalla es el buffer donde se van a copiar los datos de la pantalla, *longitud la longitud de los datos a copiar y tiout el tiempo de espera de la respuesta.

esta funcion da un true o false si se ejecuta, pero yo la defino en delphi:

function captura_pantalla(HCLIENT: integer; pantalla: string; longitud: integer; tout: integer ):bool; ¿seria esto correcto?
,

1. En pascal el tipo "string" no es una cadena de char terminado en null, por lo tanto debes usar un puntero ( Pchar ).
2. Al ser el parámetro "int *longitud" un puntero , lo tienes que pasar como
puntero "Var longitud: integer".
3. Debes definir la funcion estilo C/C++ "stdcall". Buscalo en la Help de Delphi.

coletaun 20-07-2006 11:48:25

var puntero?
 
Cierto:

Pongo la llamada "stdcall" y hago la llamada a la dell externa, ya que otras funciones contenidas enla libreria van perfectamente, es esta la que no da rsultado.
Si utilizo la variable tipo Pchar asi:

function captura_pantalla(HCLIENT: integer; pantalla: Pchar; longitud: integer; tout: integer ):bool;

da un error acces violation "libreria.dll"....etc.

¿como defino la variable var longitud: integer? , pensaba que estaba bien, o como le digo que es un puntero?

Muchas gracias.

ppb 20-07-2006 11:54:31

Se define tal cual "Var longitud:integer"

Código:

function captura_pantalla(HCLIENT: integer; pantalla: Pchar; Var longitud: integer; tout: integer ):bool;

coletaun 20-07-2006 12:00:53

ok
 
Os listo lo de la variable longitud.
PEro al definir enla funcion pantalla como pchar, me da el error éste de (acces violation en la dll...)
Que otro tipo de variable podria poner??

Es decir ahora pongo pantalla: Pchar; y me da el error, ¿algo como var pantalla: char? para indicarle que es un puntero???

Muchas gracias

ppb 20-07-2006 12:07:52

¿ Como defines el buffer ? Es decir a donde apunta el puntero "pantalla"

coletaun 20-07-2006 12:56:56

Definicion De Buffer
 
Mira en c la funcion me viene definida de esta forma:

* Función para copiar los datos de la pantalla.
*
* Argumentos:
*
* 'hclient'
* INPUT: Identificador de la sesión.
*
* 'pantalla'
* OUTPUT: buffer donde se van a copiar los datos de la pantalla.
*
* 'longitud'
* INPUT: tama¤o de 'buffer'.
* OUTPUT: n£mero de caracteres copiados en 'buffer'.
*
* 'tout'
* INPUT: tiempo en segundos que esperar la respuesta del host si la
* sesión est en WAIT. Si es 0 la función retornar inmediatamente.
* Si se cumple el tiempo sin haber recibido la respuesta del host,
* la función retornar FALSE.
*
* Retorno:
* TRUE Ok, FALSE Error.
*-------------------------------------------------------------------------*/
BOOL WINAPI captura_pantalla(HCLIENT hclient, char *pantalla, int *longitud, int tout);



ahora mismo la funcion la defino asi:

function captura_pantalla(HCLIENT: hclient; pantalla: string; var longitud: integer; tout: integer ):bool;stdcall; external 'funcionexterna.dll'

la llamada en el procedimeinto la hago asi:

captura_pantalla(1,pantalla,longitud,0);

1 es el manejador de la sesion, es correcto pues en otras funciones utilizo 1 y va correcto.
en pantalla no me copia ningun carcter.
la longitud me da "0".
He probado con 0, tout, con 1, 2 etcc.. y da igual

Y la funcion me da false, es decir que no recibe respuesta.

Muchas gracias,

ppb 20-07-2006 15:29:19

Cita:

Empezado por coletaun
'

la llamada en el procedimeinto la hago asi:

captura_pantalla(1,pantalla,longitud,0);


Me referia a donde apunta el puntero "pantalla",
tienes algo asi

Código Delphi [-]
Var
  pantalla : Pchar;
  Buffer    : Array [0..???] Of char;
  longitud : integer;
Begin
 
  pantalla := @Buffer; 
 
  captura_pantalla(1,pantalla,longitud,0);
 
   ........

coletaun 20-07-2006 19:14:27

gracias
 
gracias, la libreria si que se ejecuta pero al mostrar los datos en un string se me cierra el programa

tengo los datos enla variable pantalla que es pchar, como lo paso a un string `para mostrarlo en un memo por ejemplo?

De verdad muchas gracias

ppb 20-07-2006 19:48:21

Puedes hacer in "cast" en la llamada a la función o mover los
datos;

Código Delphi [-]
 
// CAST 
Var  pantalla : String;  longitud : integer;Begin      captura_pantalla(1,Pchar(pantalla),longitud,0);    ........// Mover datos Var  pantalla : Pchar;  Buffer    : Array [0..???] Of char;  longitud : integer;  s : String;Begin   pantalla := @Buffer;    captura_pantalla(1,pantalla,longitud,0);  Move( buffer , s , longitud );    SetLength(s, longitud );   // ó    SetLength(s, longitud );  s:=buffer;   ........

ppb 20-07-2006 19:53:15

"Repito que ha salido un churro."

Puedes hacer in "cast" en la llamada a la función o mover los
datos;




Código Delphi [-]// CAST
Var
pantalla : String;
longitud : integer;
Begin

captura_pantalla(1,Pchar(pantalla),longitud,0); ........

// Mover datos
Var
pantalla : Pchar;
Buffer : Array [0..???] Of char;
longitud : integer;
s : String;
Begin

pantalla := @Buffer;

captura_pantalla(1,pantalla,longitud,0);

Move( buffer , s , longitud );

SetLength(s, longitud );

// ó

SetLength(s, longitud );

s:=buffer;

........

ppb 20-07-2006 19:54:22

"Repito que ha salido un churro."

Puedes hacer in "cast" en la llamada a la función o mover los
datos;

Código Delphi [-]

// CAST 
Var  
  pantalla : String;  
  longitud : integer;
Begin      
 
  captura_pantalla(1,Pchar(pantalla),longitud,0);    ........
 
// Mover datos 
Var  
  pantalla : Pchar;  
  Buffer    : Array [0..???] Of char;  
  longitud : integer;  
  s : String;
Begin   
 
  pantalla := @Buffer;    
 
  captura_pantalla(1,pantalla,longitud,0);  
 
  Move( buffer , @s[1] , longitud ); // no se si tienes que poner @ puede ser  Move( buffer , s[1] , longitud );  
 
  SetLength(s, longitud );   
 
   // ó    
 
  SetLength(s, longitud );  
 
  s:=buffer;   

  ........

coletaun 20-07-2006 22:38:38

pesadez
 
Hola comapañero, sienteo ser pesado per a la hora de mover los datos me da un error en la aplicación y se cierra, cuando hago el Move( buffer , s[1] , longitud );

Es decir no consigo sacar los datos en un string.

Gracias

ppb 21-07-2006 14:46:04

Prueba el cast o la segunda manera

Código Delphi [-]
 
// CAST 
Var  
  pantalla : String;  
  longitud : integer;
Begin      

  captura_pantalla(1,Pchar(pantalla),longitud,0);    ........
 
// Mover datos 
Var  
  pantalla : Pchar;  
  Buffer    : Array [0..???] Of char;  
  longitud : integer;  
  s : String;
Begin   
 
  pantalla := @Buffer;    
   captura_pantalla(1,pantalla,longitud,0);  
 
  SetLength(s, longitud );  

  s:=buffer;   
 
  ........


La franja horaria es GMT +2. Ahora son las 02:50:57.

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