2013-02-22 12 views
5

Ho una DLL di estensione MFC che esporta una classe C++ e ho bisogno di modificare il comportamento di un metodo di classe. Le modifiche non influiscono sulla firma dei metodi della classe.Recompiling MFC Extension DLL modifica i punti di ingresso delle funzioni esportate

Non voglio ricompilare i moduli che hanno utilizzato il file "lib" della versione precedentemente rilasciata di questa libreria.

Cosa succede se le modifiche modificano l'indirizzo dei punti di ingresso delle funzioni?

Ad esempio, l'indirizzo del costruttore cambiato:

Export Ordinal  Function Hint      Entry Point 
[+ ] 3 (0x0003) 2 (0x0002) [email protected]@[email protected] 0x00009CB0 (OLD DLL) 
[+ ] 3 (0x0003) 2 (0x0002) [email protected]@[email protected] 0x00009760 (NEW DLL) 

Devo ricompilare i moduli che utilizzano la libreria in ogni caso?

Ho testato la libreria ricompilata, con nuovi punti di accesso, utilizzando gli eseguibili rilasciati e tutto funziona correttamente. Non sono sicuro che questo scenario nasconda alcuni effetti collaterali.

Quando è necessario ricompilare un collegamento eseguibile a una DLL?

Quando viene interrotta la compatibilità binaria?

risposta

2

Questo è uno dei vantaggi dell'utilizzo di una DLL: è possibile modificarlo e finché si continua a mantenere le stesse funzioni, le firme funzionano correttamente. Il collegamento avviene quando il programma viene caricato, quindi un cambio di indirizzo non fa alcuna differenza.

Si vorrà essere assolutamente certi che tutte le classi definite nella DLL non hanno metodi in linea, poiché potrebbero non funzionare con eventuali modifiche interne all'oggetto.

La compatibilità binaria viene interrotta quando cambia la firma di una funzione o quando una variabile membro pubblica cambia posizione all'interno dell'oggetto. Eviterei del tutto le variabili dei membri pubblici in una DLL.

Modifica: come indicato nei commenti, è anche possibile ottenere dei problemi se le variabili vengono aggiunte o rimosse dalla classe, modificandone le dimensioni. Questo diventa un problema se gli oggetti vengono creati al di fuori della DLL, sia come variabili locali o tramite new. È possibile evitare ciò creando tutte le istanze dell'oggetto dalla DLL e passando i puntatori al chiamante. Puoi anche evitare problemi usando lo PIMPL idiom sulle tue classi.

+0

Poiché sembra che utilizzi le classi, un'altra istanza che potrebbe causare una rottura sottile, oltre al commento sulla posizione, è se nuove variabili membro vengono aggiunte all'interno di una classe che risiede nella DLL. –

+0

@NikBougalis, grazie per il promemoria - Ho aggiunto alla mia risposta per coprire questa situazione. –

+0

Grazie a tutti per il vostro aiuto. – sam

Problemi correlati