2013-02-22 10 views
5

Bir C++ sınıfı veren bir MFC Extension DLL var ve bir sınıf yönteminin davranışını değiştirmem gerekiyor. Değişiklikler, sınıfın yöntemlerinin imzasını etkilemez.Yeniden MFC Extension DLL, dışa aktarılan işlevlerin giriş noktalarını değiştiriyor

Bu kitaplığın daha önce yayımlanmış sürümünün "lib" dosyasını kullanan modülleri yeniden derlemek istemiyorum.

Bu değişiklikler, işlevlerin giriş noktaları adresini değiştirdiğinde ne olur?

Örneğin, yapıcı adresi değişti:

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) 

Zaten kütüphane kullanma modüllerini yeniden derlemek gerekir?

Yeniden oluşturulan kitaplığı - yeni giriş noktalarıyla - yayımlanan yürütülebilir dosyaları kullanarak test ettim ve her şey iyi çalışıyor. Bu senaryonun bazı yan etkileri gizlediğinden emin değilim.

Bir yürütülebilir bağlantıyı bir DLL'ye yeniden derlemek ne zaman gereklidir?

İkili uyumluluk ne zaman bozulur?

cevap

2

Bu, bir DLL kullanmanın yararlarından biridir - bunu değiştirebilir ve aynı işlev imzalarını kullanmaya devam ettiğiniz sürece her şey yolunda gidecektir. Bağlantı, program yüklendiğinde gerçekleşir, bu nedenle adres değişikliği herhangi bir değişiklik yaratmaz.

Nesnede herhangi bir iç değişiklik yapamayabileceğinden, DLL'de tanımlanan sınıfların satır içi yöntemlere sahip olmadığından kesinlikle emin olmak istersiniz.

Bir işlev imzası değiştiğinde veya bir ortak üye değişkeni nesne içinde yer değiştirdiğinde ikili uyumluluk bozulur. Genel üye değişkenlerini DLL'de tamamen önlerim.

Düzenleme: Yorumlarda belirtildiği gibi, değişkenler sınıf içine eklenir veya kaldırılırsa boyutunu da değiştirebilir. Üste | Geri Bildirim Ver Neden Nesneler DLL dışında, yerel değişkenler veya new üzerinden oluşturulursa, bu sorun olur. Tüm nesne örneklerinizi DLL içinde oluşturarak ve işaretçiyi arayan kişiye ileterek bundan kaçınabilirsiniz. Ayrıca, sınıflarınızdaki PIMPL idiom'u kullanarak sorunlardan da kaçınabilirsiniz.

+0

Sınıflar kullanıyor gibi göründüğü için, konum hakkında yorumunuza ek olarak, ince kırılmalara neden olabilecek başka bir örnek de, DLL'de bulunan bir sınıf içinde yeni üye değişkenleri eklenirse budur. –

+0

@NikBougalis, hatırlattığınız için teşekkürler - Bu durumu kapatmak için cevabımı ekledim. –

+0

Yardımlarınız için herkese teşekkürler. – sam