Ver Mensaje Individual
  #2  
Antiguo 05-02-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Leyendo lo que escribes me parece que vas por buen camino; pero falta un detalle que es importante porque por el momento tu aplicación funciona de milagro.

La mayoría de funciones de la API de Windows a las que se les pasa un buffer como parámetro, presuponen que dicho buffer ya existe. Recuerda que un PChar no es sino un apuntador y tú debes asignarle memoria explícitamente, por ejemplo, con GetMem:

Código Delphi [-]
GetMem(S, Message.LParam+1);

Al no hacerlo, el compilador te manda la advertencia y GlobalGetAtomName pone la información a donde quiera que apunte S, que, al no estar inicializada, como puede apuntar a un lugar donde no hace daño, también puede apuntar a un lugar que cause un Access Violation.

Posteriormente, antes de salir del procedimiento RecibirCadena, deberás liberar la memoria asignada con FreeMem.

Ahora bien, la documentación de GlobalAddAtom indica que la cadena deberá tener un máximo de 255 caracteres. Una forma de evitar la asignación manual de memoria es usando un arreglo de caracteres:

Código Delphi [-]
var
  S: array[0..255] of Char;

Una variable de este tipo es compatible con PChar por lo que puedes pasarla directamente a GlobalGetAtomName y ya tiene asignados 256 bytes de memoria.

Finalmente, veamos porque de sumarle 1.

Todo PChar, además de los caracteres en sí que contenga, debe terminar en un caracter 0 (#0) que es lo que sirve para saber dónde en la memoria termina la cadena.

Cuando pasas PChar(Cadena) a GlobalAddAtom, el compilador automáticamente convierte el string en pchar agregando el #0 necesario. Pero en GlobalGetAtomName, el trabajo ya no lo hace delphi sino Windows y él va a agregar ese cero. Si tu cadena mide 20 caracteres y sólo reservas espacio para 20, Windows colocara el cero como caracter 21, excediendo el tamaño reservado y por tanto en una parte de memoria que no te pertenece.

// Saludos
Responder Con Cita