Uzantı DLL'leri Başlatma
Uzantı DLL'lerin CWinApp türetilmiş nesnesi olmadığından (normal DLL'lerde vardır), başlangıç ve sonlandırma kodunuzu MFC DLL Sihirbazı'nın ürettiği DllMain işlevine eklemelisiniz.
Sihirbaz uzantı DLL'ler için aşağıdaki kodu sağlar. Kodda, PROJNAME proje adınız için yer tutucudur.
#include "stdafx.h"
#include <afxdllx.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE PROJNAMEDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("PROJNAME.DLL Initializing!\n");
// Extension DLL one-time initialization
AfxInitExtensionModule(PROJNAMEDLL,
hInstance);
// Insert this DLL into the resource chain
new CDynLinkLibrary(Dll3DLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("PROJNAME.DLL Terminating!\n");
}
return 1; // ok
}
Başlangıç sırasında CDynLinkLibrary nesnesi oluşturma, DLL uzantılarının CRuntimeClass nesnelerini veya kaynaklarını istemci uygulamadan dışarı aktarmasına izin verir.
Eğer uzantı DLL'inizi bir veya daha fazla normal DLL'den kullanacaksanız, CDynLinkLibrary nesnesi oluşturan bir başlangıç işlevi dışarı aktarmalısınız. Bu işlev, uzantı DLL'i kullanan her normal DLL'den çağrılmalıdır. Uzantı DLL'in dışarı aktarılmış sınıflarını veya işlevlerini kullanmadan önce bu başlangıç işlevini, normal DLL'in CWinApp türetilmiş nesnesinin InitInstance üye işlevinde çağırmak uygun bir yerdir.
MFC DLL Sihirbazı'nın ürettiği DllMain'de, AfxInitExtensionModule çağrısı CDynLinkLibrary nesnesi oluşturulduğunda, modülün çalışma zamanı sınıflarının (CRuntimeClass yapıları) yanı sıra kullanılan nesne üreticilerini (COleObjectFactory nesneleri) yakalar. AfxInitExtensionModule dönüş değerini denetlemelisiniz; eğer AfxInitExtensionModule'den sıfır değeri dönüldüyse, DllMain işlevinizden sıfır dönün.
Eğer uzantı DLL'iniz çalıştırılabilire açıkça bağlanacaksa (çalıştırılabilir DLL'e bağlanmak için AfxLoadLibrary çağırır anlamında) DLL_PROCESS_DETACH'te AfxTermExtensionModule'e bir çağrı eklemelisiniz. Bu işlev, her işlem uzantı DLL'den ayrıldığında (işlem çıktığında veya AfxFreeLibrary çağrısı sonucu DLL kaldırıldığında olur) MFC'nin uzantı DLL'i temizlemesini sağlar. Eğer uzantı DLL'iniz uygulamaya dolaylı olarak bağlanacaksa, AfxTermExtensionModule çağrısı gerekli değildir.
Uzantı DLL'lere açıkça bağlanan uygulamalar DLL'i boşaltırken AfxTermExtensionModule 'ü çağırmalıdır. Uygulama çoklu iş parçacığı kullanıyorsa, AfxLoadLibrary'i ve AfxFreeLibrary'i de kullanmalıdırlar (LoadLibrary ve FreeLibrary Win32 işlevleri yerine). AfxLoadLibrary ve AfxFreeLibrary kullanma, uzantı DLL yüklendiğinde ve kaldırıldığında yürütülen başlangıç ve kapatma kodunun genel MFC durumunu bozmayacağını garanti eder.
DllMain çağrıldığında MFCx0.dll tamamen başlatılmış olduğundan, DllMain içinde bellek ayırabilir ve MFC işlevlerini çağırabilirsiniz (16 bit MFC sürümü aksine).
Uzantı DLL'ler DllMain'deki DLL_THREAD_ATTACH ve DLL_THREAD_DETACH durumlarını işleyerek çoklu iş parçacığı oluşturmayla ilgilenir. İş parçacıkları DLL'e iliştirildiğinde ve DLL'den ayrıldığında bu durumlar DllMain'e geçirilir. DLL iliştirirken TlsAlloc çağırmak, DLL'in DLL'e iliştirilmiş her iş parçacığı için olan iş parçacığı yerel depolama dizinlerini sürdürmesini sağlar.
Afxdllx.h başlangıç dosyasının AFX_EXTENSION_MODULE ve CDynLinkLibrary tanımları gibi uzantı DLL'lerde kullanılan özel yapı tanımları içerdiğini unutmayın. Bu başlangıç dosyasını uzantı DLL'inize dahil etmelisiniz.
Not
Stdafx.h'taki hiçbir _AFX_NO_XXX makrosunu tanımlamamanız veya tanımsız hale getirmemeniz önemlidir.Daha fazla bilgi için bkz. Bilgi Bankası makalesi "PRB: _AFX_NO_XXX öğesini Tanımlarken Çıkan Sorunlar" (Q140751).Bilgi Tabanı makalelerini MSDN Kitaplığında veya https://support.microsoft.com/?ln=tr sitesinde bulabilirsiniz.
Çoklu iş parçacığı oluşturmayı işleyen örnek bir başlangıç işlevi Windows SDK'daki Dinamik Bağlama Kitaplığında İş Parçacığı Yerel Depolama Kullanma'da vardır. Örneğin LibMain adlı giriş noktası işlevi içerdiğini ama sizin bunu MFC ve C çalışma zamanı kitaplıklarıyla çalışabilmesi için bu işlevi DllMain olarak adlandırmanız gerektiğini unutmayın.
DLLHUSK MFC örneği başlangıç işlevi kullanımını gösterir.
Ne yapmak istiyorsunuz?
Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?
Normal DLL'lerde Veritabanı, OLE ve Yuva Uzantı DLL'leri Kullanma
Dinamik bağlama kitaplığı giriş noktası işlevi (Windows SDK)