Aracılığıyla paylaş


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

MFC'ye statik olarak bağlı normal DLL, MFC'yi dahili olarak kullanan DLL'dir ve DLL'deki dışa 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 çeşit DLL'ler MFC'nin statik bağlantı kitaplık sürümü kullanılarak oluşturulur. İşlevler genellikle standart C arabirimi kullanan normal DLL'den dışa aktarılan. Normal DLL'in nasıl yazılacağı, oluşturulacağı ve kullanılacağı ile ilgili örnek için, bkz. DLLScreenCap.

USRDLL teriminin artık Visual C++ belgelerinde kullanılmadığını unutmayınız. MFC'ye statik olarak bağlı normal DLL'in önceki USRDLL ile aynı özellikleri vardır.

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

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

  • DLL uygulamaların kullandığı aynı MFC statik bağlantılı kitaplıklara bağlanabilirler. Artık DLL'ler için ayrı bir statik bağlantılı kitaplık sürümü yoktur.

  • MFC'nin 4.0 sürümünden önce, USRDLL'ler MFC'ye statik olarak bağlı normal DLL'lerle aynı işlevleri sağlarlardı. Visual C++ sürüm 4.0'dan itibaren USRDLL terimi artık kullanılmamaktadır.

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

  • Bu tür DLL CWinApp'dan türetilen bir sınıf örneği 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.

  • USRDLL'in artık kullanılmamasına rağmen hala _USRDLL'i derleyici komut satırında tanımlamalısınız. Bu tanım hangi bildirimlerin MFC başlık dosyalarından çekildiğini belirler.

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ın ana ileti göndericisi sırayla DLL'in uygulama nesnesi CWinApp::PreTranslateMessage üye işlevini çağıran DLL'den dışa aktarılmış bir yordam çağırmalıdır.

Bu işlevin bir örneği için DLLScreenCap örneğine bakın.

Simgeler genellikle standart C arabirimi kullanan normal DLL'den dışa aktarılır. Normal DLL'den dışa 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 gerekirse ya da çağıran çalıştırılabilirle DLL arasında MFC'den türetilen nesnelerin geçmesi 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 statik olarak bağlı olan bir DLL aynı zamanda paylaşılan MFC DLL'lerine dinamik olarak bağlanamaz. MFC'ye statik olarak bağlı olan DLL diğer her DLL gibi uygulamaya dinamik olarak bağlıdır, uygulama da ona diğer DLL'lere bağlı olduğu gibi bağlıdır.

Standart MFC statik bağlantı kitaplıkları MFC DLL'leri İsimlendirme Kuralları'ndaki kurallara göre isimlendirilir. Ancak, MFC sürüm 3.0 ve daha sonrasıyla birlikte, bağlamak istediğiniz MFC kitaplığının sürümünü bağlayıcıya el ile belirtmeniz artık gerekli değildir. Bunun yerine MFC başlık dosyaları bağlanacak olan MFC kitaplığının doğru sürümünü önişlemcinin tanımlamasına göre otomatik olarak belirler, örneğin _DEBUG veya _UNICODE. MFC başlık dosyaları MFC kitaplığının belirli bir sürümünü bağlamak için bağlayıcıyı bilgilendiren /DEFAULTLIB yönergesini ekler.

Ne yapmak istiyorsunuz?

Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Kavramlar

DLL Türleri