Dynamic-Link Kitaplığı Entry-Point İşlevi

DLL isteğe bağlı olarak bir giriş noktası işlevi belirtebilir. Varsa, bir işlem veya iş parçacığı DLL'yi her yüklediğinde veya kaldırdiğinde sistem giriş noktası işlevini çağırır. Basit başlatma ve temizleme görevlerini gerçekleştirmek için kullanılabilir. Örneğin, yeni bir iş parçacığı oluşturulduğunda iş parçacığı yerel depolamayı ayarlayabilir ve iş parçacığı sonlandırıldığında temizleyebilir.

DLL'nizi C çalışma zamanı kitaplığına bağlıyorsanız, sizin için bir giriş noktası işlevi sağlayabilir ve ayrı bir başlatma işlevi sağlamanıza izin verebilir. Daha fazla bilgi için çalışma zamanı kitaplığınızın belgelerine bakın.

Kendi giriş noktanızı sağlıyorsanız DllMain işlevine bakın. DllMain adı, kullanıcı tanımlı bir işlev için yer tutucudur. DLL'nizi oluştururken kullandığınız gerçek adı belirtmeniz gerekir. Daha fazla bilgi için geliştirme araçlarınızla birlikte verilen belgelere bakın.

Entry-Point İşlevini Çağırma

Sistem, aşağıdaki olaylardan herhangi biri gerçekleştiğinde giriş noktası işlevini çağırır:

  • Bir işlem DLL'yi yükler. Yük süresi dinamik bağlama kullanan işlemler için, dll işlemi başlatma sırasında yüklenir. Çalışma zamanı bağlama kullanan işlemler için, LoadLibraryveya LoadLibraryExönce DLL yüklenir.
  • Bir işlem DLL'yi kaldırır. İşlem sonlandırıldığında veya FreeLibrary işlevini çağırdığında DLL kaldırılır ve başvuru sayısı sıfır olur. TerminateProcess veya TerminateThread işlevinin bir sonucu olarak işlem sonlandırılırsa, sistem DLL giriş noktası işlevini çağırmaz.
  • DLL'yi yükleyen bir işlemde yeni bir iş parçacığı oluşturulur. İş parçacıkları oluşturulduğunda bildirimi devre dışı bırakmak için DisableThreadLibraryCallsişlevini kullanabilirsiniz.
  • DLL'yi yükleyen bir işlemin iş parçacığı, TerminateThread veya TerminateProcesskullanılarak değil normal şekilde sonlandırılır. Bir işlem DLL'yi kaldırdığında, giriş noktası işlevi işlemin mevcut her iş parçacığı için bir kez değil, tüm işlem için yalnızca bir kez çağrılır. İş parçacıkları sonlandırıldığında bildirimi devre dışı bırakmak için DisableThreadLibraryCallskullanabilirsiniz.

Bir kerede yalnızca bir iş parçacığı giriş noktası işlevini çağırabilir.

Sistem, işlevin çağrılmasına neden olan işlem veya iş parçacığı bağlamında giriş noktası işlevini çağırır. Bu, DLL'nin çağırma işleminin sanal adres alanında bellek ayırma veya işlem tarafından erişilebilen tanıtıcıları açma amacıyla giriş noktası işlevini kullanmasına olanak tanır. Giriş noktası işlevi, iş parçacığı yerel depolama (TLS) kullanarak yeni bir iş parçacığına özel bellek de ayırabilir. İş parçacığı yerel depolaması hakkında daha fazla bilgi için bkz. İş Parçacığı Yerel Depolama .

Entry-Point İşlev Tanımı

DLL giriş noktası işlevi, standart çağrı çağırma kuralıyla bildirilmelidir. DLL giriş noktası doğru bildirilmezse, DLL yüklenmez ve sistem DLL giriş noktasının WINAPI ile bildirilmesi gerektiğini belirten bir ileti görüntüler.

işlevinin gövdesinde, DLL giriş noktasının çağrıldığı aşağıdaki senaryoların herhangi bir bileşimini işleyebilirsiniz:

  • bir işlem DLL'yi (DLL_PROCESS_ATTACH) yükler.
  • Geçerli işlem yeni bir iş parçacığı (DLL_THREAD_ATTACH) oluşturur.
  • bir iş parçacığı normal olarak çıkar (DLL_THREAD_DETACH).
  • bir işlem DLL'yi (DLL_PROCESS_DETACH) kaldırır.

Giriş noktası işlevi yalnızca basit başlatma görevlerini gerçekleştirmelidir. LoadLibrary veya LoadLibraryEx işlevini (veya bu işlevleri çağıran bir işlevi) çağırmamalıdır çünkü bu, DLL yükleme sırasına bağımlılık döngüleri oluşturabilir. Bu, sistem başlatma kodunu yürütmeden önce bir DLL'nin kullanılmasına neden olabilir. Benzer şekilde, giriş noktası işlevi işlem sonlandırma sırasında FreeLibrary işlevini (veya FreeLibraryçağıran bir işlevi) çağırmamalıdır, çünkü bu durum sistem sonlandırma kodunu yürütdükten sonra bir DLL'nin kullanılmasına neden olabilir.

giriş noktası işlevi çağrıldığında Kernel32.dll işlem adres alanına yüklenmesi garanti edildiğinden, Kernel32.dll'deki işlevlerin çağrılması başlatma kodu yürütülmeden önce DLL'nin kullanılmasına neden olmaz. Bu nedenle, giriş noktası işlevi kritik bölümler ve köşeler gibi eşitleme nesneleri oluşturabilir ve TLS kullanabilir çünkü bu işlevler Kernel32.dlliçinde bulunur. Örneğin, Advapi32.dlliçinde bulunduğundan kayıt defteri işlevlerini çağırmak güvenli değildir.

Diğer işlevleri çağırmak, tanılaması zor sorunlara neden olabilir. Örneğin, DLL'lerindeki bazı işlevler loadLibrarydiğer sistem bileşenlerini yüklemek içinçağırdığından User, Shell ve COM işlevlerini çağırmak erişim ihlali hatalarına neden olabilir. Buna karşılık, sonlandırma sırasında bu işlevleri çağırmak, ilgili bileşen zaten kaldırılmış veya başlatılmamış olabileceğinden erişim ihlali hatalara neden olabilir.

Aşağıdaki örnek, DLL giriş noktası işlevinin nasıl yapılandır yapılacağını gösterir.

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

Entry-Point İşlev Dönüş Değeri

bir işlem yüklendiği için DLL giriş noktası işlevi çağrıldığında, işlev başarıyı göstermek için TRUE döndürür. Yük süresi bağlama kullanan işlemler için FALSE dönüş değeri işlemin başlatılmasının başarısız olmasına ve işlemin sonlandırılmasına neden olur. Çalışma zamanı bağlama kullanan işlemler için YANLIŞ değerinin döndürülmesi, LoadLibrary veya LoadLibraryEx işlevinin NULLdöndürerek hataya işaret eder. (Sistem hemen DLL_PROCESS_DETACH ile giriş noktası işlevinizi çağırır ve DLL'yi kaldırır.) Giriş noktası işlevinin dönüş değeri, işlev başka bir nedenle çağrıldığında göz ardı edilir.