2013-02-22 8 views
5

Ich habe eine MFC Extension DLL, die eine C++ - Klasse exportiert, und ich muss das Verhalten einer Klassenmethode ändern. Die Änderungen haben keinen Einfluss auf die Signatur von Methoden der Klasse.Neu kompilieren MFC Extension DLL ändert Einstiegspunkte von exportierten Funktionen

Ich möchte die Module, die die "lib" -Datei der zuvor freigegebenen Version dieser Bibliothek verwendet, nicht neu kompilieren.

Was passiert, wenn die Änderungen die Eingangspunkte der Funktionen ändern?

Zum Beispiel die Adresse des Konstrukteurs verändert:

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) 

Sollte ich die Module neu kompilieren, die die Bibliothek trotzdem verwenden?

Ich testete die neu kompilierte Bibliothek - mit neuen Einstiegspunkten - mit den freigegebenen ausführbaren Dateien und alles funktioniert gut. Ich bin nicht sicher, dass dieses Szenario einige Nebenwirkungen versteckt.

Wann ist es notwendig, eine ausführbare Datei zu einer DLL zu rekompilieren?

Wann wird die Binärkompatibilität unterbrochen?

Antwort

2

Dies ist einer der Vorteile der Verwendung einer DLL - Sie können es ändern, und solange Sie weiterhin die gleichen Funktionssignaturen behalten, wird alles gut funktionieren. Die Verknüpfung erfolgt beim Laden des Programms, so dass eine Änderung der Adresse keinen Unterschied macht.

Sie sollten absolut positiv sein, dass alle in der DLL definierten Klassen keine Inline-Methoden haben, da diese möglicherweise nicht mit internen Änderungen am Objekt funktionieren.

Die Binärkompatibilität wird unterbrochen, wenn sich eine Funktionssignatur ändert oder wenn eine öffentliche Membervariable den Standort innerhalb des Objekts ändert. Ich würde öffentliche Membervariablen in einer DLL zusammen vermeiden.

Edit: wie in den Kommentaren notiert, können Sie auch in Schwierigkeiten geraten, wenn Variablen hinzugefügt oder aus der Klasse entfernt werden, indem Sie ihre Größe ändern. Dies wird zu einem Problem, wenn Objekte außerhalb der DLL erstellt werden, entweder als lokale Variablen oder über new. Sie können dies vermeiden, indem Sie alle Ihre Objektinstanzen innerhalb der DLL erstellen und Zeiger an den Aufrufer übergeben. Sie können auch Probleme vermeiden, indem Sie PIMPL idiom für Ihre Klassen verwenden.

+0

Da er scheint, Klassen zu verwenden, ist eine weitere Instanz, die subtilen Bruch verursachen kann, zusätzlich zu Ihrem Kommentar zum Speicherort, wenn neue Membervariablen innerhalb einer Klasse hinzugefügt werden, die sich in der DLL befindet. –

+0

@NikBougalis, danke für die Erinnerung - Ich habe meine Antwort hinzugefügt, um diese Situation zu decken. –

+0

Danke an alle für Ihre Hilfe. – sam