Soy nuevo en la programación de Windows y acabo de "perder" dos horas buscando un error que todos parecen conscientes: no puede crear un objeto en el montón en una DLL y destruirlo en otra DLL (o en general) programa).¿Las DLL (estáticamente vinculadas) usan un montón diferente que el programa principal?
Estoy casi seguro de que en Linux/Unix este NO es el caso (si es así, dígalo, pero estoy seguro de que lo hice miles de veces sin problemas ...).
En este momento tengo un par de preguntas:
1) No usar DLL vinculados estáticamente un montón diferente que el programa principal?
2) ¿Está la DLL enlazada estáticamente asignada en el mismo espacio de proceso del programa principal? (Estoy bastante seguro de que la respuesta aquí es un gran SÍ, de lo contrario no tendría sentido pasar punteros desde una función en el programa principal a una función en una DLL).
Estoy hablando de DLL normal/regular, no los servicios/ATL COM
EDIT: Por "enlazado estáticamente" quiero decir que yo no uso LoadLibrary para cargar el archivo DLL pero enlazar con la biblioteca de código auxiliar
Depende de la configuración de cada módulo. En general, si dos módulos utilizan el CRT dinámico, entonces comparten el montón, ya que ambos tienen la misma instancia del CRT cargado. Si un módulo usa el CRT estático, entonces tiene su propia pila, ya que tiene su propia instancia del CRT enlazado estáticamente. – Luke
@Luke - Además, es posible que diferentes módulos utilicen diferentes versiones del CRT dinámico (DLL), y por lo tanto diferentes montones. – Bukes
Casi todas las DLL no triviales tendrían que_ crear su propio montón, si lo piensas bien. Tome la biblioteca OpenAL como un ejemplo. Puede alimentar datos a un objeto buffer (la lib crea su propia copia de los datos), establecer algunos parámetros y la biblioteca reproducirá el sonido: genial, fácil, perfecto, sin preocupaciones. Ahora imagine que dos programas cargan la biblioteca. Dónde colocar los datos, ¿a quién pertenece? ¿En qué parte de la RAM física es? ¿Quiero que "algún otro programa" pueda ver (o modificar) los datos en el montón de mi programa? Si vive en el montón de tu módulo principal, estás en problemas ... – Damon