Dinamik Olarak MFC'ye Bağlı Normal MFC DLL'leri
MFC'ye dinamik olarak bağlı normal MFC DLL'si, MFC'yi dahili olarak kullanan bir DLL'dir ve DLL'deki dışarı aktarılan işlevler MFC veya MFC olmayan yürütülebilir dosyalar tarafından çağrılabilir. Adından da açıklandığı gibi, bu tür DLL'ler MFC'nin dinamik bağlantı kitaplığı sürümü (MFC'nin paylaşılan sürümü olarak da bilinir) kullanılarak oluşturulur. İşlevler genellikle standart C arabirimi kullanılarak normal bir MFC DLL'den dışarı aktarılır.
Geçerli modül durumunu DLL için bir değere ayarlamak üzere MFC'ye dinamik olarak bağlanan normal MFC DLL'lerinde dışarı aktarılan tüm işlevlerin başına makro eklemeniz AFX_MANAGE_STATE
gerekir. 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( ))
MFC'ye dinamik olarak bağlı normal bir MFC DLL aşağıdaki özelliklere sahiptir:
Bu, Visual C++ 4.0 tarafından sunulan yeni bir DLL türüdür.
İstemci yürütülebilir dosyası DLL'lerin kullanımını destekleyen herhangi bir dilde yazılabilir (C, C++, Pascal, Visual Basic vb.); MFC uygulaması olması gerekmez.
Statik olarak bağlı normal MFC DLL'sinin aksine, bu dll türü dinamik olarak MFC DLL'sine (paylaşılan MFC DLL olarak da bilinir) bağlanır.
Bu dll türüne bağlı MFC içeri aktarma kitaplığı, MFC DLL'leri veya MFC DLL'sini kullanan uygulamalar için kullanılanla aynıdır: MFCxx(D).lib.
MFC'ye dinamik olarak bağlı normal bir MFC DLL'sinin gereksinimleri şunlardır:
Bu DLL'ler, MFC DLL'sine dinamik olarak bağlı bir yürütülebilir dosya gibi tanımlanmış _AFXDLL ile derlenir. Ancak _USRDLL , MFC'ye statik olarak bağlı normal bir MFC DLL'sinde olduğu gibi tanımlanır.
Bu tür DLL'ler türetilmiş bir
CWinApp
sınıfın örneğini oluşturmalıdır.Bu DLL türü MFC tarafından sağlanan öğesini
DllMain
kullanır. Dll'ye özgü tüm başlatma kodunu üye işlevineInitInstance
ve sonlandırma kodunuExitInstance
normal bir MFC uygulamasında olduğu gibi yerleştirin.
Bu tür DLL, MFC'nin dinamik bağlantı kitaplığı sürümünü kullandığından, geçerli modül durumunu DLL için bir olarak açıkça ayarlamanız gerekir. Bunu yapmak için DLL'den dışarı aktarılan her işlevin başındaki AFX_MANAGE_STATE makroyu kullanın.
normal MFC DLL'leri, MFC uygulaması gibi - türetilmiş bir CWinApp
sınıfa ve bu uygulama sınıfının tek bir nesnesine sahip olmalıdır. Ancak, CWinApp
dll nesnesinin ana ileti pompası yok, bir uygulamanın nesnesi gibi CWinApp
.
Uygulamanın ana ileti pompasına CWinApp::Run
sahip olması nedeniyle mekanizmanın dll için geçerli olmadığını unutmayın. DLL'niz modsuz iletişim kutuları getiriyorsa veya kendi ana çerçeve penceresine sahipse, uygulamanızın ana ileti pompasının çağıran CWinApp::PreTranslateMessage
DLL dışarı aktarılan yordamı çağırması gerekir.
Dll'ye özgü tüm başlatmaları CWinApp::InitInstance
normal bir MFC uygulamasında olduğu gibi üye işlevine yerleştirin. CWinApp::ExitInstance
Türetilmiş sınıfınızın CWinApp
üye işlevi, DLL yüklenmeden önce MFC tarafından sağlanan DllMain
işlevden çağrılır.
Paylaşılan DLL'leri MFCx0.dll ve Msvcr*0.dll (veya benzer dosyaları) uygulamanızla dağıtmanız gerekir.
MFC'ye dinamik olarak bağlı dll de MFC'ye statik olarak bağlanamaz. Uygulamalar, MFC'ye dinamik olarak bağlı normal MFC DLL'lerine diğer DLL'ler gibi bağlanır.
Simgeler genellikle standart C arabirimi kullanılarak normal bir MFC DLL'den dışarı aktarılır. Normal MFC DLL'sinden dışarı aktarılan bir işlevin bildirimi şöyle görünür:
extern "C" __declspec(dllexport) MyExportedFunction( );
Normal bir MFC DLL içindeki tüm bellek ayırmaları DLL içinde kalmalıdır; DLL, aşağıdakilerden herhangi birini çağıran yürütülebilir dosyaya geçmemeli veya bu yürütülebilir dosyadan almamalıdır:
MFC nesnelerine yönelik işaretçiler
MFC tarafından ayrılan belleğe işaretçiler
Yukarıdakilerden herhangi birini yapmanız gerekiyorsa veya çağıran yürütülebilir dosya ile DLL arasında MFC türetilmiş nesneleri geçirmeniz gerekiyorsa, bir MFC uzantısı DLL'i oluşturmanız gerekir.
C çalışma zamanı kitaplıkları tarafından bir uygulama ile DLL arasında ayrılan işaretçileri belleğe geçirmek, yalnızca verilerin bir kopyasını oluşturursanız güvenlidir. Bu işaretçileri silmemeli, yeniden boyutlandırmamalı veya belleğin bir kopyasını oluşturmadan kullanmamalısınız.
MFC'ye dinamik olarak bağlanan normal bir MFC DLL oluştururken, MFC modül durumunu doğru şekilde değiştirmek için makro AFX_MANAGE_STATE kullanmanız gerekir. 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( ))
AFX_MANAGE_STATE makro, MFC'ye statik olarak bağlanan normal MFC DLL'lerinde veya MFC uzantısı DLL'lerinde kullanılmamalıdır. Daha fazla bilgi için bkz . MFC Modüllerinin Durum Verilerini Yönetme.
Normal bir MFC DLL yazma, derleme ve kullanma örneği için örnek DLLScreenCap dosyasına bakın. MFC'ye dinamik olarak bağlanan normal MFC DLL'leri hakkında daha fazla bilgi için, örneğin özetindeki "DLLScreenCap'i MFC DLL ile Dinamik Olarak Bağlamaya Dönüştürme" başlıklı bölüme bakın.
Ne yapmak istiyorsunuz?
Ne hakkında daha fazla bilgi edinmek istiyorsunuz?
MFC'ye dinamik olarak bağlı normal bir MFC DLL'sinin modül durumları
Normal MFC DLL'lerinde Veritabanı, OLE ve Yuva MFC uzantısı DLL'leri Kullanma