Aracılığıyla paylaş


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( ))

Ne hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Visual Studio'da C/C++ DLL'leri oluşturma