Aracılığıyla paylaş


Çalışma-Zamanı Kitaplığı Davranışı

C/C++ çalışma zamanı kitaplığı kodu, DLL başlatma sırasını gerçekleştirir ve böylece Windows 3.x'te gerekli olan ayrı bir modülle çalışma ihtiyacını ortadan kaldırır. C/C++ çalışma zamanı kitaplık kodunda _DllMainCRTStartup adındaki DLL giriş noktası işlevi bulunur. _DllMainCRTStartup işlevi, C/C++ çalışma zamanı kitaplığını başlatan _CRT_INIT'i çağırmak dahil birçok şey yapar ve statik, yerel olmayan değişkenlerde C++ yapılandırıcılarını çağırır. Bu işlev olmadığında çalışma zamanı kitaplığı başlatılmamış durumda bırakılır. _CRT_INIT statik olarak bağlantılı CRT için veya bir kullanıcı DLL'sinden CRT DLL Msvcr90.dll'ye bağlantı için kullanılabilir.

/ENTRY kullanarak başka bir giriş noktası işlevini belirtmek mümkün iken: bağlayıcı seçeneği önerilmez çünkü giriş noktası işlevinizin _DllMainCRTStartup öğesinin yaptığı her şeyi çoğaltması gerekir. Visual C++'da DDL'ler oluştururken _DllMainCRTStartup için otomatik olarak bağlantı oluşturulur ve /ENTRY: bağlayıcı seçeneğini kullanarak bir giriş noktası işlevi belirtmeniz gerekmez.

C çalışma zamanı kitaplığı başlatılırken ek olarak _DllMainCRTStartup, DllMain adında bir işlev çağırır. Oluşturduğunuz DLL türüne bağlı olarak, Visual C++ sizin için DllMain sağlar ve _DllMainCRTStartup tarafından her zaman çağırılacak bir şey olması için bağlantılandırılır. Bu şekilde DLL'nizi başlatmanız gerekmiyorsa DLL dosyanızı oluştururken yapmanız gereken özel bir şey yoktur. DLL'nizi başlatmanız gerekiyorsa, kodunuzu eklemeniz gereken yer hangi tür DLL yazdığınıza bağlıdır. Daha fazla bilgi için bkz. DLL Başlatma.

C/C++ Çalışma Zamanı Kitaplığı kodu statik, yerel olmayan değişkenlerde kurucular ve yıkıcılar çağırır. Örneğin, aşağıdaki kodda DLL kaynağı Equus ve Sugar, CHorse sınıfına ait iki statik, yerel olmayan nesnedir, Horses.h üzerinde tanımlanır. Bu nesneler herhangi bir fonksiyonun dışında tanımlandığından, CHorse öğesine ilişkin bir oluşturucu işlevine veya yıkıcı işlevine çağrılar içeren veri kodunda hiçbir işlev mevcut değil. Bu yüzden, bu oluşturuculara ve yıkıcılara yapılan çağrılar çalışma zamanı kodu tarafından gerçekleştirilmelidir. Uygulamalar için çalışma zamanı kitaplık kodu da bu işlevi görür.

#include "horses.h"

CHorse  Equus( ARABIAN, MALE );
CHorse  Sugar( THOROUGHBRED, FEMALE );

BOOL    WINAPI   DllMain (HANDLE hInst, 
                            ULONG ul_reason_for_call,
                            LPVOID lpReserved)
...

Yeni bir işlemin DLL kullanma girişiminde bulunduğu her seferde, işletim istemi DLL verilerine yönelik ayrı bir kopya oluşturur: buna işlem bağlanma adı verilir. DLL öğesine ilişkin çalışma zamanı kitaplık kodu, tüm genel nesneler için, mevcutsa, oluşturucuları çağırır ve sonra seçilen işlem bağla öğesiyle DllMain işlevini çağırır. Karşıt durum işlem ayırmadır: çalışma zamanı kitaplığı kodu seçilen işlem ayırmalarıyla DllMain öğesini çağırır ve daha sonra atexit işlevleri, genel nesneler için yok ediciler ve statik nesneler için yokediciler de dahil sonlandırma işlevlerinin listesini çağırır. İşlem iliştirmedeki olayların sırası, işlem ayırmadaki sıranın tersidir.

Çalışma zamanı kitaplık kodu da iş parçacığı ekleme ve kaldırma sırasında çağrılır, ancak çalışma zamanı kodu başlı başına başlatma veya sonlandırma içermez.

Ne yapmak istiyorsunuz?

Ayrıca bkz.

Kavramlar

DLL'ler