Aracılığıyla paylaş


Dinamik Olarak MFC'ye Bağlı Normal DLL'ler

MFC'ye dinamik olarak bağlı normal DLL, MFC'yi dahili olarak kullanan DLL'dir ve DLL'deki dışarı aktarılan işlevler hem MFC hem de MFC dışı çalıştırılabilirler tarafından çağrılabilir. Adından da belli olduğu gibi, bu tür DLL MFC'nin dinamik bağlantı kütüphane sürümü (MFC'nin paylaşılan sürümü olarak da bilinir) kullanılarak yapılandırılır. İşlevler genellikle standart C arabirimi kullanan normal DLL'den dışarı aktarılan.

Geçerli modül durumunu DLL için olana ayarlamak amacıyla MFC'ye dinamik olarak bağlanan normal DLL'lerdeki dışarı aktarılmış tüm işlevlerin başına AFX_MANAGE_STATE makrosunu eklemelisiniz. Bu, DLL'den dışarı aktarılmış işlevlerin başına aşağıdaki kod satırını ekleyerek yapılır.

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

MFC'ye dinamik olarak bağlı normal DLL aşağıdaki özelliklere sahiptir:

  • Bu, Visual C++ 4.0 ile gelen yeni bir DLL türüdür.

  • İstemci çalıştırılabilir DLL'lerin kullanımını destekleyen herhangi bir dilde yazılabilir (C, C++, Pascal, Visual Basic vb.), MFC uygulaması olması gerekmez.

  • Statik olarak bağlanmış normal DLL'lerden farklı olarak, bu tür DLL MFC DLL'ye (paylaşılan MFC DLL olarak da bilinir) dinamik olarak bağlıdır.

  • Bu tür DLL'ye bağlı MFC dışarı aktarım kütüphanesi uzantı DLL'lerini ya da MFC DLL'yi kullanan uygulamalar için kullanılanla aynıdır: MFCxx(D).lib.

MFC'ye dinamik olarak bağlı normal DLL aşağıdaki gereksinimlere sahiptir:

  • Bu DLL'ler, MFC DLL'ye dinamik olarak bağlı bir çalıştırılabilir gibi, tanımlanan _AFXDLL ile derlenir. Ama _USRDLL de, MFC'ye statik olarak bağlı normal DLL gibi, tanımlıdır.

  • Bu tür DLL CWinApp türetilmiş sınıfı oluşturmalıdır.

  • Bu tür DLL MFC'nin sağladığı DllMain'i kullanır. Normal MFC uygulamasındaki gibi DLL'e özel başlangıç kodlarını InitInstance üye işlevine ve sonlandırma kodunu ExitInstance'a yerleştirin.

Bu tür DLL MFC'nin dinamik bağlantı kütüphane sürümünü kullandığı için, geçerli modül durumunu DLL için olana özel olarak ayarlamalısınız. Bunu yapmak için, DLL'den dışarı aktarılmış her işlevin başında AFX_MANAGE_STATE makrosunu kullanın.

MFC uygulamalarında olduğu gibi normal DLL'ler CWinApp'tan türetilen sınıfa ve bu uygulama sınıfının bir objesine sahip olmalıdırlar. Ancak bir uygulamanın CWinApp nesnesinde olan ana ileti göndericisi, DLL CWinApp nesnesinde yoktur.

Uygulamanın kendi ana ileti göndericisi olduğundan CWinApp::Run mekanizmasının DLL'e uygulanamayacağını unutmayın. Eğer DLL geçici iletişim penceresi açarsa ya da kendi ana penceresi varsa, uygulamanızın ana ileti göndericisi CWinApp::PreTranslateMessage'ı çağıran DLL tarafından dışarı aktarılmış bir yordam çağırmalıdır.

Normal MFC uygulamasındaki gibi, tüm DLL'e özel başlangıçları CWinApp::InitInstance üye işlevine yerleştirin. CWinApp türetilmiş sınıfınızın CWinApp::ExitInstance üye işlevi DLL kaldırılmadan önce DllMain işlevini sağlayan MFC'den çağrılır.

MFCx0.dll ve Msvcr*0.dll paylaşılan DLL'leri (ya da benzer dosyalar) uygulamanızla dağıtmalısınız.

MFC'ye dinamik olarak bağlı olan bir DLL aynı zamanda paylaşılan MFC DLL'lerine statik olarak bağlanamaz. Uygulamalar diğer DLL'ler gibi MFC'ye dinamik olarak bağlı normal DLL'lere bağlanır.

Simgeler genellikle standart C arabirimi kullanan normal DLL'den dışarı aktarılır. Normal DLL'den dışarı aktarılan bir işlevin bildirimi şuna benzer:

extern "C" __declspec(dllexport) MyExportedFunction( );

Normal DLL'deki bütün bellek yüklemeleri DLL'de kalmalıdır, DLL çağıran çalıştırılabilirden aşağıdakileri ne almalıdır ne ona vermelidir:

  • MFC nesnelerine işaretçiler

  • MFC'nin ayırdığı belleğe işaretçiler

Eğer yukarıdakilerden birini yapmanız ya da çağıran çalıştırılabilirle DLL arasında MFC'den türetilen nesneleri geçirmeniz gerekirse, uzantı DLL oluşturmalısınız.

Verinin bir kopyasını yaptığınız takdirde, uygulama ve DLL arasında C çalışma zamanı kitaplıkları tarafından ayrılan belleklere işaretçi geçirmek güvenlidir. Bu işaretçileri silmemeli, yeniden boyutlandırmamalı ya da belleğin kopyasını yapmadan kullanmamalısınız.

MFC'ye dinamik olarak bağlı normal DLL oluştururken, MFC modül durumuna doğru biçimde geçmek için AFX_MANAGE_STATE makrosunu kullanmanız gerekir. Bu, DLL'den dışarı aktarılmış işlevlerin başına aşağıdaki kod satırını ekleyerek yapılır.

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

AFX_MANAGE_STATE makrosu MFC'ye statik olarak bağlı normal DLL'lerde ya da uzantı DLL'lerinde kullanılmamalıdır. Daha fazla bilgi için, bkz. MFC Modüllerinin Durum Bilgisini Yönetme.

Normal DLL'in nasıl yazılacağı, oluşturulacağı ve kullanılacağı ile ilgili örnek için, bkz. DLLScreenCap. MFC'ye dinamik olarak bağlı normal DLL'ler hakkında daha fazla bilgi için, bu örneğin özetindeki "DLLScreenCap'i MFC DLL'yle Dinamik olarak Bağlamak için Dönüştürme" başlıklı bölüme bakınız.

Ne yapmak istiyorsunuz?

Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Kavramlar

DLL Türleri