Estoy tratando de llamar a un procedimiento en una DLL de Delphi desde C#. El procedimiento espera que la persona que llama preasigne e ingrese un array of array of TSomeRecord
, del cual manipulará los elementos TSomeRecord
como medio para devolver los resultados. Por lo tanto, tengo que crear manualmente matrices dinámicas de Delphi de matrices de X.
Ahora, I have found here que un array of X
dinámico consiste en un puntero al primer elemento de la matriz dinámica, y que ese primer elemento tiene un recuento de referencia y la longitud (número de elementos) de la matriz antepuesto (ambos números enteros de 32 bits), y que los elementos se almacenan en línea y de forma contigua, por lo que todo el asunto es el siguiente en la memoria:¿Cuál es el diseño de memoria de una matriz dinámica Delphi de una matriz dinámica de X?
rrrrllll000...000111...12... ^
con rrrr la cuenta de referencias , llll la longitud,los elementos y^a donde apunta el puntero. Esto confirma; Lo he probado y funciona.
Para matrices dinámicas multidimensionales he asumido que puedo sustituir array of Y
para la X
en array of X
, en otras palabras, que la dimensión exterior es simplemente una matriz dinámica de (punteros a) matrices dinámicas, así:
rrrrllll000011112222... ^
donde los elementos 0000, 1111, etc. ahora son punteros de 32 bits para matrices dinámicas asignadas de forma independiente. Sin embargo, hacerlo de esta manera me genera una infracción de acceso a mis problemas. Aparentemente, no es así como Delphi espera que lo haga. ¿Alguien puede explicarme cómo se supone que debo hacer esto? am
Gracias por su respuesta. Me doy cuenta de que esto podría ser más fácil de diagnosticar con código (ejemplo), pero no tengo ninguno; solo la firma del procedimiento. La DLL es una caja negra de terceros. –
Entonces, el único consejo que puedo darle es que siga el principio de que quien lo asigne también debe desasignar, o envolver la DLL en Delphi a delphi.exe (comserver) o dll primero que elimina los tipos automáticos de la interfaz –