Pregunta

Tarea:

aplicación escrita en Delphi acepta una estructura (record en términos de Delphi) de tres campos. Puedo enviar el puntero de esta estructura utilizando la función SendMessage (Win32 API).

Así que una pregunta es:

¿Cómo mantener cierta representación de la estructura en la memoria para Delphi en términos de Delphi?

tiene el tipo

PWPModPostData = ^ TWPModPostData;
TWPModPostData = record
   DataType: Integer;
   Data: PChar;
   Next: PWPModPostData;
end;

¿Cómo definir en C? Es decir, ¿hay alguna campos ocultos o de servicio en las estructuras de Delphi?

¿Fue útil?

Solución

No, no hay campos ocultos, y los registros de Delphi y C estructuras se pueden asignar a uno del otro 1: 1, con algunas salvedades:

  • No utilice ningún tipo de datos C no entender. Esto incluye objetos, matrices dinámicas y cadenas de Delphi.

  • C y Delphi veces tienen diferente ideas acerca de cómo los campos de byte a alinear. Probar sus registros y verificar que que trabajan en el lado C. Si ellos no, trate de usar registro lleno en lugar de registro .

  • Cuando se pasa un puntero a un registro de C a Delphi o viceversa, hacer Asegúrese de que el lado que lo recibe no intentar liberar o reasignar el memoria. Pertenece a la memoria gerente que lo creó.

Otros consejos

Tenga en cuenta que mientras que sin duda puede enviar la dirección de dicha estructura a otra aplicación como el LPARAM de un SendMessage() llaman es muy probable que no funcione. La razón es que el mismo puntero por lo general no apuntan a la misma posición de memoria física cuando se utiliza en otra aplicación con su propio rango de direcciones.

Funciona para algunos mensajes de Windows como WM_GETTEXT, y en estos casos el sistema operativo hace el mapeo necesario detrás de la cortina, por lo que la aplicación receptora puede copiar los datos al búfer asignado por la aplicación de llamada y la dirección apunta a la misma cantidad de memoria física en ambas aplicaciones.

El mismo se puede conseguir mediante el uso de la WM_COPYDATA mensaje, que está destinada a hacer la maniobra necesaria de memoria cuando se hace el intercambio de datos entre dos aplicaciones.

Sin embargo, la estructura en su pregunta tiene otro problema, ya que contiene punteros a memoria. La documentación WM_COPYDATA afirma explícitamente que esto no se debe hacer. Mientras que la dirección de todo el bloque de memoria será modificado para que sea válido en la aplicación receptora del sistema no puede saber qué partes del bloque de memoria son punteros y tendrían que ser asignada también. Por lo tanto, todos contenían punteros se quedará como está y probablemente no válido. Su lista simplemente enlazada se romperá, y los elementos PChar no siendo accesible.

Editar

En cuanto a su comentario: Por encima de los puntos son importantes sólo si intenta enviar mensajes de otras aplicaciones; si lo hace desde un archivo DLL cosas van a funcionar, debido a una DLL comparte el espacio de direcciones del proceso que se cargó en, por lo que un puntero utilizado en la aplicación o cualquier DLL cargado siempre apuntará a la misma posición de memoria. Lo sentimos por cualquier confusión que esto podría haber causado, pero no era obvio para mí por su pregunta que el intercambio de datos ocurre dentro de una aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top