Sono nuovo alla programmazione di Windows e ho appena "perso" due ore a caccia di un bug di cui tutti sembrano a conoscenza: non è possibile creare un oggetto sull'heap in una DLL e distruggerlo in un'altra DLL (o nella principale programma).Le DLL (collegate in modo statico) utilizzano un heap diverso rispetto al programma principale?
Sono quasi sicuro che su Linux/Unix questo NON è il caso (se lo è, per favore dillo, ma sono abbastanza sicuro di averlo fatto migliaia di volte senza problemi ...).
A questo punto ho un paio di domande:
1) Se le DLL collegate staticamente utilizzare un mucchio diverso rispetto al programma principale?
2) La DLL collegata staticamente è mappata nello stesso spazio del processo del programma principale? (Sono abbastanza sicuro che la risposta qui è un grande SÌ altrimenti non avrebbe senso passare i puntatori da una funzione nel programma principale a una funzione in una DLL).
sto parlando plain/DLL regolare, non servizi/COM ATL
EDIT: Con il termine "legato staticamente" voglio dire che io non uso LoadLibrary per caricare la DLL, ma ho legame con la libreria di stub
Dipende dalle impostazioni per ciascun modulo. Generalmente, se due moduli utilizzano il CRT dinamico, condividono l'heap poiché entrambi hanno la stessa istanza del CRT caricato. Se un modulo utilizza il CRT statico, ha il suo heap poiché ha una propria istanza del CRT collegata staticamente. – Luke
@Luke - Inoltre, è possibile che diversi moduli utilizzino versioni diverse del CRT dinamico (DLL), e quindi diversi cumuli. – Bukes
Praticamente ogni DLL non banale dovrà _ creare il proprio heap, se ci pensate. Prendi la libreria OpenAL come esempio. È possibile alimentare i dati su un oggetto buffer (la lib crea la propria copia dei dati), impostare alcuni parametri e la libreria riprodurrà il suono: grande, facile, perfetto, senza preoccupazioni. Ora immagina che _two_ programmi caricino la libreria. Dove mettere i dati, chi è il proprietario? In quale parte della RAM fisica si trova? Voglio che "qualche altro programma" sia in grado di vedere (o modificare) i dati sull'heap del mio programma? Se vive sull'heap del tuo modulo principale, sei nei guai ... – Damon