Bu Not, mfc kitaplık Windows dinamik bağlantı kitaplığı (dll) bir parçası olarak kullanmak izin normal dll dosyaları açıklar. Bu Windows DLL ve bunları nasıl kullanmayı bildiğinizi varsayar. mfc uzantısı uzantıları mfc kitaplık oluşturmanıza olanak verir, DLL dosyaları hakkında bilgi için bkz: dll sürümü, mfc.
Dll arabirimleri
Düzenli DLL'ler, dll arasındaki uygulama arabirimleri normal c benzeri işlevler veya açıkça verilen sınıfları belirtilen varsayalım. mfc sınıf arabirimleri verilemiyor.
Hem uygulama, hem de bir dll mfc kullanmak istiyorsanız, ardından hem paylaşılan mfc kitaplıklarını kullanabilir veya statik olarak bunlara bağlı mfc kitaplık bir kopyasına sahip bir seçim var. Visual c++ 4.0 için önceki sürümlerde, mfc statik bağlantı kitaplığı uygulamaları ve DLL dosyaları için farklı. mfc, uygulama ve dll geçerli sürümüyle hem mfc kitaplık standart sürümlerinden birini kullanabilir. Bu sürümde (mfc çalışma zamanında seçim yapar) ayrı bir kitaplığı DLL değil.
Düzenli DLL'ler birkaç avantajlara sahip olacaksınız.:
API sınırlamaları
Bazı mfc yetenekleri teknik sınırlamalar nedeniyle dll sürümü için geçerli değildir veya bu hizmetler genellikle uygulama tarafından sağlanır. Bu sınırlamalar aşağıdadır:
Dll oluşturma
Düzenli dll mfc için statik olarak bağlantı derlerken sembolleri "_usrdll" ve "_WINDLL" tanımlanmalıdır. dll kodunuzu da aşağıdaki derleyici anahtarlarını ile derlenmiş olması gerekmektedir:
Düzenli dll mfc için dinamik bağlantı derlerken, yukarıdaki simgeleri tanımlamak ve yukarıdaki derleyici anahtarlarını kullanın. Additonally, "_afxdll" sembolü tanımlanmalıdır ve dll kodunuz ile derlenmiş olması gerekmektedir:
Dll arasındaki uygulama arabirimleri (API) açıkça verilmelidir. c arabirimleri yapışmasını mümkün olduğunca düşük bant genişliği için Arabirimlerinizden tanımladığınız önerilir. Daha doğrudan c arabirimleri daha karmaşık c++ sınıfları bakımı daha kolaydır.
C ve c++ dosyaları (c++ programcıları, dll müşterilerinize sınırı olmayacaktır Bu şekilde) tarafından eklenebilir ayrı başlık, API yerleştirin. Üstbilgisini TRACEAPI bakın.H mfc Gelişmiş kavram örnek dlltrace için bir örnek. İşlevlerinizi vermek için onları modülü tanım dosyanızı ihracat bölümünde girin (.def) ya da __declspec(dllexport) , işlev tanımları içerir. Bu işlevler istemci yürütülebilir almak için __declspec(dllimport) kullanın.
Dinamik bir dll için geçerli modül durumunu ayarlamak için mfc bağlantı normal DLL'leri verilen tüm fonksiyonları başında afx_manage_state makro eklemeniz gerekir. Bu işlev dll dosyasından verilen başına kod aşağıdaki satırı ekleyerek yapılır:
nbsp; & nbsp;
Afx_manage_state (AfxGetStaticModuleState ())
nbsp; & nbsp;
WinMain - > DllMain
Mfc kitaplık, CWinApp türetilen nesne olarak normal bir mfc uygulaması başlatan standart Win32 DllMain giriş noktası tanımlar. Normal bir mfc uygulaması InitInstance üye işlev tüm dll özgü başlatma yeri.
Not Bu yana uygulamanın ana mesajı pompa sahibi CWinApp::Run mekanizması bir dll için geçerli değildir. dll getiriyor kadar kalıcı olmayan iletişim kutuları veya kendi ana çerçeve penceresi varsa, uygulamanızın ana mesajı pompa CWinApp::PreTranslateMessage çağıran-verilen bir rutin çağırmalısınız.
Bu işlevin kullanımı için dlltrace örnek bkz.
DLL'yi bellekten önce türetilmiş sınıf mfc çağrılacak, CWinApp ExitInstance üye işlevi DllMain işlevi sağlanan.
Bunu hep birlikte bağlamak için yapmanız gerekenler
Mfc için statik olarak bağlantı normal DLL'ler ile (nafxcwd. bu kitaplığı dll bağlanmalıdırLIB ya da nafxcw.LIB) olarak adlandırılan c runtimes sürüm ile birlikte ' LIBCMT.LIB'. Bu kütüphanelerin önceden ve Visual c++ Kur'u çalıştırdığınızda belirterek yüklenebilir.
Örnek kod
Lütfen bkz: mfc Gelişmiş kavram örnek program dlltrace tam bir örnek. Bu basit bir dll olarak adlandırılan içerir ' İZLEYİCİ.dll' o Implements afx izleme bayrakları iletişim (bkz. Teknik Not 7). Ayrıca iletişim kutusunu kullanmak için dll dosyasını çağıran basit bir Merhaba uygulama vardır.
Unutulmaması gereken birkaç ilginç bir şey:
TRACEAPI aşağıdaki ayıklamak.H ne mfc için statik olarak bağlanan normal dll içinde tanımlı tek bir API için gerekli olduğunu göstermektedir:
#ifdef __cplusplus
extern "c" {}
#endifnbsp; / * __cplusplus * /
struct TracerData
{
bool bEtkin;
UI&NT bayrakları;
};
bool far pascal dışa PromptTraceFlags (TracerData far * lpData);
#ifdef __cplusplus
}
endif
Bu örnekte, bir 'extern "c" {}' blok c++ kullanıcıları için bildirim içine. Bu birçok avantajı vardır. dll API kullanılabilir olmayan C++ istemci uygulamaları tarafından kolaylaştırır. İkinci olarak, c++, ad bozma verilen ada uygulanmaz çünkü dll yükünü azaltır. Son olarak, bunu açıkça eklemek kolaylaştırır bir.def-ad bozma hakkında endişelenmenize gerek kalmadan (sıralı dışa aktarmak için) dosya.
"far pascal verme" tüm API işlevleri vardır. Değil stricly rağmen Win32 DLL için gerekli bu tanımları için kolay geri taşımak için 16 bit Windows tutulmuştur. far, pascalve ihracat makroları tüm Win32 altında hiçbir şey genişletin.
API tarafından kullanılan yapıları mfc sınıflardan türetilen değil ve tamamen API üstbilgisinde tanımlanır. Bu dll ve uygulama arasındaki arabirimi karmaşıklığı azaltır ve bir kez daha, dll de c programlar tarafından kullanılabilir kılan.
API kullanılan herhangi bir veri işaretçileri açık far işaretçiler bulunmaktadır. Yine, far, Win32 için gerçekten gerekli değil ama ileride 16-bit Windows için kodu derlemek planlıyorsanız yararlıdır.
Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre