MFC'ye Dinamik Olarak Bağlı Normal MFC DLL'sinin Modül Durumları
Normal bir MFC DLL'sini MFC DLL'sine dinamik olarak bağlama özelliği, çok karmaşık olan bazı yapılandırmalara olanak tanır. Örneğin, normal bir MFC DLL ve bunu kullanan yürütülebilir dosya hem MFC DLL'sine hem de herhangi bir MFC uzantısı DLL'sine dinamik olarak bağlanabilir.
Bu yapılandırma, geçerli CWinApp
nesnenin işaretçisi ve eşlemeleri işleme gibi MFC genel verileriyle ilgili bir sorun oluşturur.
MFC 4.0 sürümünden önce, bu genel veriler MFC DLL'nin kendisinde yer alır ve işlemdeki tüm modüller tarafından paylaşılırdı. Win32 DLL kullanan her işlem DLL'nin verilerinin kendi kopyasını aldığından, bu düzen işlem başına verileri izlemek için kolay bir yol sağlar. Ayrıca, AFXDLL modeli işlemde yalnızca bir CWinApp
nesne ve tek bir tanıtıcı eşleme kümesi olacağını varsaydığından, bu öğeler MFC DLL'nin kendisinde izlenebilir.
Ancak normal bir MFC DLL'sini MFC DLL'sine dinamik olarak bağlama özelliği sayesinde artık bir işlemde iki veya daha fazla CWinApp
nesne ve iki veya daha fazla tanıtıcı eşleme kümesi olması mümkündür. MFC hangilerini kullanması gerektiğini nasıl izler?
Çözüm, her modüle (uygulama veya normal MFC DLL) bu genel durum bilgilerinin kendi kopyasını vermektir. Bu nedenle, normal MFC DLL'sindeki AfxGetApp çağrısı yürütülebilir dosyadaki nesneye CWinApp
değil DLL'deki nesneye bir işaretçi döndürür. MFC genel verilerinin modül başına bu kopyası modül durumu olarak bilinir ve MFC Tech Note 58'de açıklanmıştır.
MFC ortak pencere yordamı otomatik olarak doğru modül durumuna geçer, bu nedenle normal MFC DLL'nizde uygulanan ileti işleyicilerinde bu konuda endişelenmeniz gerekmez. Ancak yürütülebilir dosyanız normal MFC DLL'sini çağırdığında, geçerli modül durumunu AÇıKÇA DLL için bir olarak ayarlamanız gerekir. Bunu yapmak için DLL'den dışarı aktarılan her işlevde AFX_MANAGE_STATE makroyu kullanın. Bu işlem, DLL'den dışarı aktarılan işlevlerin başına aşağıdaki kod satırının eklenmesiyle gerçekleştirilir:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))