Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No creo que pueda usar un string sin conocer de antemano la longitud de la cadena devuelta. Dicho de otra forma, necesitaría usar SetLength antes de la llamada, de lo contrario no habría memoria asignada para recibir el resultado.

// Saludos
Responder Con Cita
  #2  
Antiguo 09-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
No creo que pueda usar un string sin conocer de antemano la longitud de la cadena devuelta. Dicho de otra forma, necesitaría usar SetLength antes de la llamada, de lo contrario no habría memoria asignada para recibir el resultado.
Teniendo encuenta que va a usar una función de una dll parecida a GetSystemDirectory:
Cita:
Empezado por usuario87 Ver Mensaje
...mi programa usa una funcion que esta dentro de una dll, esta funcion es parecida a GetSystemDirectory...
El tamaño debe ser MAX_PATH. El problema del tamaño también lo tenemos en un buffer, y como ya dije antes debe asignarlo antes de usarlo:
Cita:
Empezado por escafandra Ver Mensaje
...puedes usar un Buffer tipo array of char o un String con longitud asignada previamente o un ShortString si no va a ser mas larga de 255...
Luego debes reasignar el tamaño del String al verdadero número de caracteres. En definitiva usas el String como un mero Buffer. Un ejemplo:
Código Delphi [-]
var
 S: String;
begin
 SetLength(S, 100);              // Asigno un tamaño
 lstrcpy(@S[1], 'Hola');         // API estilo C para copiar una cadena terminada en nulo 'Hola'#0
 S:= String(PAnsiChar(@S[1]));   // Reasigno el tamaño del String
end;

Saludos.
Responder Con Cita
  #3  
Antiguo 09-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es cierto que tienes que reasignar el tamaño también al regreso de la función. Pero sí usas un string, también tienes que ponerlo antes, así sea MAX_PATH. Si mandas el string, o @S[1] así nada más, obtendrás una violación de acceso.

// Saludos
Responder Con Cita
  #4  
Antiguo 09-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Es cierto que tienes que reasignar el tamaño también al regreso de la función. Pero sí usas un string, también tienes que ponerlo antes, así sea MAX_PATH. Si mandas el string, o @S[1] así nada más, obtendrás una violación de acceso.
Estamos de acuerdo.

Saludos.
Responder Con Cita
  #5  
Antiguo 10-08-2012
usuario87 usuario87 is offline
Miembro
NULL
 
Registrado: ago 2011
Posts: 10
Poder: 0
usuario87 Va por buen camino
jeje no pense que mi preguntilla iba a causar tantas respuestas, bueno miren primero el buffer debe estar si o si en nulos porque como ya dije la funcion de la dll solo me devuelve la cadena sin el nulo (una mala imitacion de las cadenas en C xP), segundo el buffer como maximo debe ser de 255 porque me va a devolver nombres y al principio en ese codigo de visual basic especifique "Buffer = String(255,Chr(0)) 'asigna 255 nulos en la variable" , queria hacerlo con cadenas porque me parecia mucho mas facil hacer algo como esto:

Código Delphi [-]
Var
  Buffer: string;
  Posicion: Byte;
begin
  Buffer:=LlenarNulos(255); // equivalente a Buffer = String(255,Chr(0))
  ObtenerNombres(PChar(Buffer));
  Posicion:=Pos(Chr(0),Buffer);
  Buffer:=Copy(Buffer,1,Posicion-1);
  Form1.Caption:='Tamaño de la cadena: '+IntToStr(Posicion-1);
  ShowMessage(Buffer);


usare shortstring y array of char, tambien se me habia ocurrido usar una api para asignar memoria y pasarle esa direccion a la funcion de la dll y luego busco el nulo mediante un puntero a esa direccion.
gracias
Responder Con Cita
  #6  
Antiguo 10-08-2012
usuario87 usuario87 is offline
Miembro
NULL
 
Registrado: ago 2011
Posts: 10
Poder: 0
usuario87 Va por buen camino
gracias .
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como sumar con nulos? lledesma SQL 39 10-09-2008 19:28:17
como llenar la memoria Ram kurono Varios 11 10-09-2008 03:31:51
Como llenar con espacion en blanco o con ceros una cadena? Luis Alberto Varios 10 02-12-2005 19:14:02
Como Ingresar Valores En Blanco O Nulos En Access JanoRod Conexión con bases de datos 1 16-11-2005 15:40:48
S.O.S como selecciono campo nulos Ryu SQL 3 11-04-2005 16:40:50


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


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
Copyright 1996-2007 Club Delphi