TN011: mfc bir dll dosyasının bir parçası olarak kullanma
Bu not, mfc kitaplık Windows dinamik bağlantı kitaplığı (dll) bir parçası olarak kullanmanıza olanak sağlayan düzenli DLL'leri açıklar. Bunu, Windows dll ve bunları nasıl kullanmayı bildiğinizi varsayar. mfc uzantılı DLL'ler hakkında daha fazla bilgi için oluşturabileceğiniz ile mfc kitaplık uzantıları Bkz: , dll sürümü mfc.
dll arabirimleri
Arabirimler arasında uygulama ve dll c benzeri işlevler ya da açıkça verilen sınıfları belirtilen normal DLL'leri varsayalım. mfc sınıfı arabirimlerinin verilemiyor.
dll ve uygulama mfc kullanmak istiyorsanız, her ikisi de ya da paylaşılan mfc kitaplıklarını kullanabilir veya statik kitaplıkları kopyasına bağlanmak için seçim yapabilirsiniz. Uygulama ve dll mfc kitaplık standart sürümlerinden birini her ikisini de kullanabilir.
Normal DLL'leri çeşitli yararları vardır:
Dll dosyasını kullanan uygulama mfc kullanmanız gerekmez ve Visual C++ uygulaması yok.
mfc için statik olarak bağlantı normal DLL'ler ile dll dosyasının boyutu kullanılan ve bağlantılı yalnızca mfc ve c çalışma zamanı yordamları üzerinde bağlıdır.
mfc için dinamik bağlantı normal DLL'ler ile mfc paylaşılan sürümünü kullanmasını bellek Birikimleri önemli olabilir. Bununla birlikte, paylaşılan dll dosyalarını, Mfc dağıtmak<version>.dll ve Msvvcrt<version>dll ile .dll.
dll tasarım sınıfları nasıl uygulandığını bağımsızdır. dll tasarımınızda istediğiniz API'leri için dışa aktarır. Sonuç olarak, uygulama değişirse, normal DLL'leri hala geçerli.
mfc için statik olarak bağlantı normal DLL'lerle birlikte dll ve uygulama mfc kullanırsanız, mfc DLL'den veya farklı bir sürümü istediği uygulamayla hiçbir sorun vardır. mfc kitaplık her dll veya exe statik olarak bağlı olduğundan, sahip olduğunuz sürümü hakkında hiçbir soru vardır.
API sınırlamaları
dll sürümü, ya da teknik sınırlamalar nedeniyle bazı iþlevselliðinden geçerli değildir veya bu hizmetler genellikle uygulama tarafından sağlanan çünkü. mfc geçerli sürümüyle uygulanamaz tek işlevi olan CWinApp::SetDialogBkColor.
dll oluşturma
mfc, simgeler statik olarak bağlantı normal DLL'leri derlerken _USRDLL ve _WINDLL tanımlanmalıdır. dll kodunuzu ayrıca aşağıdaki derleyici anahtarlarını ile derlenmiş olmalıdır:
/D_WINDLLdll için derleme olduğunu belirtir.
/D_USRDLLNormal bir dll oluşturmakta olduğunuz belirtir.
Bu simgeler tanımlamak ve mfc için dinamik bağlantı normal DLL'leri derleme yaparken bu derleyici anahtarlarını kullanmanız gerekir. Ayrıca, sembol _AFXDLL tanımlanmalıdır ve dll kodunuz ile derlenmiş olmalıdır:
- /D_AFXDLLmfc için dinamik bağlar normal bir dll oluşturma belirtir.
dll ile uygulama arasındaki arabirimleri (API) açıkça verilmelidir. Arabirimlerinizden düşük bant genişliği olarak tanımlamak ve, yalnızca c arabirimleri kullanmanızı öneririz. Doğrudan c arabirimleri daha karmaşık C++ sınıflarını Bakımı daha kolay.
c ve C++ dosyaları dahil ayrı bir üstbilgi, API yerleştirin. mfc Gelişmiş kavram örnek başlığında ScreenCap.h görmek DLLScreenCap ilgili bir örnek. İşlevlerinizi vermek için bunları girin EXPORTS bölüm modülü tanımı dosyasının (.def) veya __declspec(dllexport) , işlev tanımları üzerinde. Use __declspec(dllimport) bu işlevler istemci yürütülebilir almak için.
Eklemeniz gerekir AFX_MANAGE_STATE makro mfc için dinamik bağlantı normal dll içinde verilen işlevlerin başında. Bu makro, bir dll için geçerli modül durumunu ayarlar. Bu makroyu kullanmak için dll dosyasından verilen işlevleri başına aşağıdaki kod satırını ekleyin:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
WinMain - > DllMain
mfc kitaplık standart Win32 tanımlar DllMain başlatır giriş noktası, CWinApp tipik bir mfc application nesnesi olarak türetilir. Tüm dll özgü başlatma koyun InitInstance yöntemi gibi tipik bir mfc uygulaması.
Uygulamanın kendi ana ileti göndericisi olduğundan CWinApp::Run mekanizmasının DLL'e uygulanamayacağını unutmayın. dll kalıcı olmayan iletişim kutuları görüntüler veya kendi ana çerçeve penceresi varsa uygulamanızın ana ileti pompasına ihtiyaç çağıran dll verilen yordam çağrısı CWinApp::PreTranslateMessage.
Bu işlevi kullanmak için DLLScreenCap örnek bkz.
DllMain mfc gelitiricinin sağlar işlevi CWinApp::ExitInstance yöntemi sınıfınızın türetilir CWinApp önce dll kaldırılır.
dll bağlama
mfc için statik olarak bağlantı normal DLL'ler ile dll Nafxcwd.lib veya Nafxcw.lib ve Libcmt.lib adlı c çalışma zamanlarının sürümü ile bağlanmanız gerekir. Bu kitaplıklar önceden oluşturulmuş uygulamayı ve Visual C++ Kur'u çalıştırdığınızda belirterek yüklenmemiş olabilir.
Örnek Kod
DLLScreenCap için tam bir örnek program mfc Gelişmiş kavram örnek bkz. Not Bu örnekte birkaç ilginç şeyler şunlardır:
dll derleyici bayrakları ve bu uygulamanın farklıdır.
Bağlantı çizgilerini ve.dll dosyaları def ve uygulama için farklıdır.
Dll dosyasını kullanan uygulama C++'olmak zorunda değildir.
dll ile uygulama arasındaki arabirimidir c ya da C++ kullanılamaz ve verilen bir API ile DLLScreenCap.def.
mfc için statik olarak bağlanan normal bir dll içinde tanımlanan bir API aşağıdaki örnekte gösterilmektedir. Bildirimi alınmış Bu örnekte, bir extern "C" { } C++ kullanıcıları engelleyin. Bu, çeşitli yararları vardır. İlk olarak, dll API'ları kullanılabilir olmayan C++ istemci uygulamaları tarafından kolaylaştırır. İkinci olarak, C++, ad bozma verilen ad uygulanmaz çünkü dll yükünü azaltır. Son olarak, bunu açıkça eklemek kolaylaştırır bir.def dosya (sıralı dışa aktarmak için) ad bozma hakkında endişelenmenize gerek olmadan.
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
struct TracerData
{
BOOL bEnabled;
UINT flags;
};
BOOL PromptTraceFlags(TracerData FAR* lpData);
#ifdef __cplusplus
}
#endif
API tarafından kullanılan yapıları mfc sınıflardan türetilmemiş ve API üstbilgisinde tanımlanır. Bu dll uygulaması arasındaki arabirimi karmaşıklığı azaltır ve dll c programlar tarafından kullanılabilir hale getirir.