Aracılığıyla paylaş


: TN033 mfc dll sürümü

Bu not MFCxx.DLL kullanabilir ve mfc uygulamaları ve dll uzantılı dinamik bağlantı kitaplıkları (burada x mfc sürüm numarasıdır) MFCxxD.DLL paylaşılan nasıl açıklar. Normal DLL'ler hakkında daha fazla bilgi için bkz: Kullanarak mfc bir dll dosyasının bir parçası olarak.

Bu teknik Not DLL'leri üç yönlerini kapsar. Gelişmiş kullanıcılar için son iki vardır:

  • Nasıl bir mfc uzantı DLL'si oluşturma

  • Nasıl mfc dll sürümünü kullanan bir mfc uygulaması oluşturma

  • mfc dinamik bağlantı kitaplıkları nasıl paylaşılan uygulanır

(Bu adlı bir normal dll) mfc uygulamalarla kullanılan mfc kullanılarak dll oluşturulmasında ilgileniyorsanız, bakın Teknik Not 11.

MFCxx.DLL desteğine genel bakış: terminoloji ve dosyaları

Normal dll: normal bir dll mfc sınıfları kullanarak tek başına bir dll oluşturmak için kullanın. "c" arabirim arabirimleri üzerinden App/dll sınırı olan ve istemci uygulaması mfc uygulaması yok.

mfc 1.0 desteklenen dll desteği sürümüdür. İçinde açıklanan Teknik Not 11 ve mfc Gelişmiş kavram örnek DLLScreenCap.

Not

Visual C++ sürüm 4.0 olarak terim usrdll eskidir ve mfc için statik olarak bağlanan normal bir dll tarafından değiştirilir.Ayrıca, mfc için dinamik bağlar normal bir dll dosyası da oluşturabilirsiniz.

mfc 3.0 (ve üstü) ole Veritabanı sınıflar da dahil olmak üzere tüm yeni işlevselliği ile normal dll dosyalarını destekler.

afxdll: Bu da, mfc kitaplıklarını paylaşılan sürüm olarak adlandırılır. mfc 2.0 eklenen yeni dll desteği budur. mfc kitaplık dll (aşağıda açıklanan) sayısı olan ve istemci uygulama veya dll gerektiriyorsa dll dinamik bağlar. Arabirimler üzerinden uygulama/dll sınırı olan C++/ mfc sınıf arabirimleri. İstemci uygulaması, mfc uygulaması olması gerekir. Bu tüm mfc 3.0 işlevselliğini destekler (özel durum: UNICODE için veritabanını sınıflar desteklenmez).

Not

Sürüm 4.0 Visual C++ gibi bu tür bir dll "Uzantısı dll." denir.

Bu notu içeren dll mfc ayarlamak, tüm başvurmak için MFCxx.DLL kullanır:

  • Hata ayıklama: MFCxxD.DLL (birleştirilmiş) ve MFCSxxD.LIB (statik).

  • Sürüm: MFCxx.DLL (birleştirilmiş) ve MFCSxx.LIB (statik).

  • Unicode hata ayıklama: MFCxxUD.DLL (birleştirilmiş) ve MFCSxxD.LIB (statik).

  • Unicode sürümü: MFCxxU.DLL (birleştirilmiş) ve MFCSxxU.LIB (statik).

Not

MFCSxx [u] [d].LIB kitaplıkları içinde kullanılan mfc ile birlikte, paylaşılan dll.Bu kitaplıklar, uygulama veya dll statik olarak bağlı olmalıdır kod içerir.

İlgili içe aktarma kitaplıklarına uygulama bağlantılar:

  • Hata ayıklama: MFCxxD.LIB

  • Yayın: MFCxx.LIB

  • Unicode hata ayıklama: MFCxxUD.LIB

  • Unicode sürümü: MFCxxU.LIB

Bir "mfc uzantı DLL'si" MFCxx.DLL kurulu bir dll (ve diğer mfc dll dosyaları paylaşılan). mfc bileşen mimarisi burada devreye girer. Yararlı bir sınıf bir mfc sınıfından türeyen veya başka bir mfc benzeri araç seti oluşturmak, bir dll dosyası yerleştirebilirsiniz. MFCxx.DLL, dll olarak kullandığı üstün istemci uygulaması yapar. Yeniden yaprak sınıfları, yeniden kullanılabilen temel sınıfları ve yeniden kullanılabilir görünüm veya belge sınıfları izin verir.

Artıları ve eksileri

Neden mfc paylaşılan sürümünü kullanmalısınız?

  • Paylaşılan kitaplık kullanarak küçük uygulamaları (mfc kitaplık çoğunu kullanan en az bir uygulama az 10 K'dır) neden olabilir.

  • mfc uzantısı DLL'ler ve normal dll mfc paylaşılan sürümünü destekler.

  • Paylaşılan mfc kitaplıklarını kullanan bir uygulama, kendisini mfc bağlantı gerekli olmadığı için statik olarak bağlı mfc uygulaması oluşturma daha hızlıdır. Bu durum özellikle geçerlidir debug burada bağlayıcısı gerekir compact hata ayıklama bilgileri yapılar — hata ayıklama bilgileri içeren dll ile bağlayarak var. uygulamanızdaki sıkıştırmak için daha az hata ayıklama bilgileri.

Neden mfc paylaşılan sürümünü kullanmamalısınız:

  • Paylaşılan kütüphaneyi kullanan bir uygulama sevkiyat gerektirir MFCxx.DLL (ve diğerleri) sevk programınızla Kitaplığı. MFCxx.DLL gibi birçok DLL'yi serbestçe dağıtılabilir, ancak hala Kur programınızın dll dosyasını yüklemeniz gerekir. Buna ek olarak, hem programınız ve mfc dll tarafından kullanılan c çalışma zamanı kitaplığı içeren MSVCRTxx.DLL hazırlamalısınız.

mfc uzantı dll dosyası yazma

mfc uzantısı dll sınıfları ve mfc sınıfları işlevselliğinin süslemek için yazılmış işlevlerini içeren bir DLL'dir. mfc uzantısı dll mfc paylaşılan DLL'lerin birkaç noktalar kullanan bir uygulama, aynı şekilde kullanır:

  • Oluşturma işlemi birkaç ek derleyici ve linker seçenekler paylaşılan mfc kitaplıklarını kullanan bir uygulama geliştirmek için benzer.

  • mfc uzantısı dll sahip olmadığı bir CWinApp-türetilmiş sınıf.

  • Özel bir mfc uzantısı dll sağlaması gerekir DllMain. AppWizard sağlayan bir DllMain değiştirebileceğiniz işlevi.

  • mfc uzantısı dll oluşturmak için bir başlatma yordamı genellikle sağlayacak bir CDynLinkLibrary uzantısı dll vermek istiyorsa CRuntimeClasses veya uygulama kaynakları. Türetilmiþ bir sýnýf, CDynLinkLibrary uzantı DLL'si-uygulama verilerinin saklanması kullanılıyor olabilir.

Bu noktalar aşağıda daha ayrıntılı olarak açıklanmıştır. mfc Gelişmiş kavram örnek başvurmak dllhusk beri bunu göstermektedir:

  • Paylaşılan kitaplıklarını kullanarak uygulama oluşturma. (DLLHUSK.exe mfc kitaplıklarını da diğer dll dosyalarını dinamik olarak bağlanan bir mfc uygulamasıdır.)

  • Bir mfc uzantı DLL'si oluşturma. (Not özel bayrakları gibi _AFXEXT uzantı dll oluşturulmasında kullanılır)

  • İki uzantı DLL mfc örnekleri. Bir mfc uzantı dll dosyası ile sınırlı verir (TESTDLL1) ve tüm sınıf arabirim (TESTDLL2) verme gösterir temel yapısını gösterir.

İstemci uygulaması ve herhangi bir uzantısı DLL'ler, MFCxx.DLL'ın aynı sürümünü kullanmanız gerekir. mfc DLL'nin kurallarına uyar ve bir debug sağlamak gerekir ve perakende (/ release), uzantı dll sürümü. İstemci programları, hem hata ayıklama hem de perakende sürümlerini uygulamalarını oluşturmak ve bunları uygun hata ayıklama ya da tüm DLL'leri perakende sürümüne bağlamak için de izin verir.

Not

C++, ad bozma ve dışa aktarma sorunları nedeniyle bir uzantı DLL'si verme listeden farklı platformlar için aynı dll hata ayıklama hem de perakende sürümlerini ve DLL'ler farklı olabilir.MFCxx.DLL perakende yaklaşık 2000 giriş noktaları dışa; MFCxxD.DLL hata ayıklama, giriş noktaları yaklaşık 3000 dışa.

hw85e4bb.collapse_all(tr-tr,VS.110).gifHızlı Not bellek yönetimi

Bu teknik notu sonuna yakın "bellek yönetimi" başlıklı kısımda MFCxx.DLL uygulamasıyla mfc paylaşılan sürümünü açıklar. Burada yalnızca bir uzantı DLL'si uygulamak için bilmeniz gerekenler açıklanmaktadır.

Aynı uygulamada yokmuş gibi MFCxx.DLL ve istemci uygulamanın adres alanına yüklenen tüm uzantı DLL'leri aynı bellek ayırıcısı, kaynak yükleme ve diğer mfc "Genel" durumları kullanır. mfc dll kitaplığı ve mfc için statik olarak bağlantı normal DLL'leri tam tersi yapın ve her dll ayrılırken kendi bellek havuzu yetersiz olması nedeniyle önemlidir.

Sonra bir uzantı DLL'si bellek ayırırsa, belleğin serbestçe herhangi bir uygulama tarafından ayrılmış nesneyle intermix. Ayrıca, paylaşılan mfc kitaplıklarını kullanan bir uygulama çökerse, işletim sisteminin koruması dll paylaşım diğer mfc uygulaması bütünlüğünü korur.

Benzer şekilde, kaynaklardan yüklemek için geçerli yürütülebilir dosya gibi "Genel" diğer mfc durumları da istemci uygulaması ve tüm uzantı DLL mfc yanı arasında kendisini MFCxx.DLL paylaşılır.

hw85e4bb.collapse_all(tr-tr,VS.110).gifBir uzantı DLL'si oluşturma

Bir mfc uzantısı dll projesi oluşturmak için AppWizard kullanın ve uygun bir derleyici ve bağlayıcı ayarları otomatik olarak oluşturur. Ayrıca üretmek olan bir DllMain değiştirebileceğiniz işlevi.

Varolan bir projeye uzantısı dll mfc dönüştürüyorsanız, mfc paylaşılan sürümünü kullanan bir uygulama oluşturmak için standart kurallar ile başlayın, sonra aşağıdakilerden birini yapın:

  • Ekleme /d_afxext derleyici bayraklarına. Proje Özellikleri iletişim kutusunda, c/C++ düğümü seçin. Sonra Önişlemci kategorisini seçin. Ekleme _AFXEXT makroları tanımlamak alana öğelerin her birini noktalı virgülle ayırarak.

  • Kaldırma /Gy derleyici anahtarý. Proje Özellikleri iletişim kutusunda, c/C++ düğümü seçin. Ardından kod oluşturma kategorisini seçin. "İşlev düzeyi bağlama etkinleştir" seçeneği etkin emin olun. Bu linker başvurulmayan işlevleri kaldırmaz çünkü sınıflar vermek daha kolay yapar. Statik olarak normal bir dll oluşturmak için kullanılan özgün proje değişikliği mfc için bağlı /mt [d derleyici seçeneği /md [d.

  • Verme kitaplıkla build /dll bağlantı seçeneği. Hedef türü olarak Win32 dinamik bağlantı kitaplığı belirterek yeni bir hedef oluşturmak bu ayarlanır.

hw85e4bb.collapse_all(tr-tr,VS.110).gifÜstbilgi dosyaları değiştirme

Amacı, uzantı dll genellikle bazı yaygın işlevleri bu işlevselliği kullanan bir veya daha çok uygulamayı vermektir. Bu sınıflar ve istemci uygulamalarınız için kullanılabilen genel işlevler verilmesi için boils down.

Bunu yapmak için her üye işlevleri alma veya verme olarak uygun olarak işaretlenir sağlamak gerekir. Bu özel bildirimleri gerektirir: __declspec(dllexport) ve __declspec(dllimport). İstemci uygulamaları tarafından sınıflarınızı kullanıldığında olarak bildirilmesi istediğiniz __declspec(dllimport). Uzantı dll kendisini oluþturulduðunda, bunlar olarak bildirilmelidir __declspec(dllexport). İstemci programları için yük baðlamak için Ayrıca işlevleri aslında, verilmelidir.

Tüm sınıfınızın dışa aktarmak için kullanmak afx_ext_class sınıf tanımında. Bu makro çerçeve tanımladığı __declspec(dllexport) , _afxdll ve _AFXEXT tanımlanan ancak olarak tanımlanan __declspec(dllimport) , _AFXEXT tanımlı değil. _AFXEXTyukarıda açıklandığı gibi yalnızca sizin uzantı dll dosyası oluşturulurken tanımlanır. Örne?in:

class AFX_EXT_CLASS CExampleExport : public CObject
{ ... class definition ... };

hw85e4bb.collapse_all(tr-tr,VS.110).gifBütün Sınıfı Dışarı Aktarmama

Bazen yalnızca gerekli üyeleri tek tek sınıfınızın vermek isteyebilirsiniz. Örneğin, CDialog türetilmiş sınıfını dışarı aktarıyorsanız, sadece oluşturucuyu ve DoModal çağrısını dışarı aktarmanız gerekebilir. Bu üyeler dll kullanarak dışa aktarabilirsiniz.def dosya ancak de kullanabilir afx_ext_class kadar aynı şekilde vermek için gereken bireysel üyelerinde.

Örne?in:

class CExampleDialog : public CDialog
{
public:
   AFX_EXT_CLASS CExampleDialog();
   AFX_EXT_CLASS int DoModal();
   // rest of class definition
   .
   .
   .
};

Bunu yaptığınızda, artık tüm sınıf üyelerini veriyorsunuz çünkü ek bir sorun ile karşılaştınız çalışabilir. Şekilde, mfc makroları iş sorunudur. Aslında MFC'nin yardımcı makrolarının çoğu veri üyelerini bildirir veya tanımlar. Bu nedenle, bu veri üyeleri de kendi dll dosyasından verilmesi gerekir.

Örneğin, uzantı DLL oluşturulurken DECLARE_DYNAMIC makrosu aşağıdaki gibi tanımlanır:

#define DECLARE_DYNAMIC(class_name) \
protected: \
   static CRuntimeClass* PASCAL _GetBaseClass(); \
   public: \
   static AFX_DATA CRuntimeClass class##class_name; \
   virtual CRuntimeClass* GetRuntimeClass() const; \

Başlayan satırın "statik AFX_DATA" statik bir nesne sınıfının içinde bildirmek. Bu sınıf doğru vermek ve çalışma zamanı bilgileri bir istemciden erişim için.exe, bu statik nesne vermek gerekir. Statik nesne AFX_DATA değiştiricisi ile bildirildiğinden, DLL'inizi derlerken sadece AFX_DATA'yı __declspec(dllexport) olarak, istemci çalıştırılabilirinizi derlerken __declspec(dllimport) olarak tanımlamalısınız.

Yukarıda anlatıldığı gibi afx_ext_class zaten bu şekilde tanımlanır. Re-define yeterlidir AFX_DATA aynı olacak şekilde afx_ext_class , sınıf tanımının içine.

Örne?in:

   #undef  AFX_DATA
   #define AFX_DATA AFX_EXT_CLASS
   class CExampleView : public CView
   {
     DECLARE_DYNAMIC()
     // ... class definition ...
   };
   #undef  AFX_DATA
   #define AFX_DATA

mfc her zaman kullanan AFX_DATA tanımladığından, makro içinde bu tür senaryoları için bu tekniği çalışması için veri öğeleri sembole. Örneğin, için çalışır DECLARE_MESSAGE_MAP.

Not

Eğer seçilen sınıf üyeleri yerine bütün sınıfı dışarı aktarıyorsanız, statik veri üyeleri otomatik olarak dışarı aktarılır.

Otomatik olarak dışa aktarmak için aynı tekniği kullanan CArchive için çıkarma işlecini kullanan sınıfları DECLARE_SERIAL ve IMPLEMENT_SERIAL makrolar. Sınıf bildirimleri'köşeli ayraç kullanımı arşiv işleç verme (bulunur.h dosyası) aşağıdaki kodu:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

<your class declarations here>

#undef AFX_API
#define AFX_API

hw85e4bb.collapse_all(tr-tr,VS.110).gif_AFXEXT Sınırlamaları

_ Kullanabilirsinizafxext pre-processor, uzantı dll uzantısı DLL dosyaları birden çok katman yoktur sürece simgesi. Önceden MFC sınıflarından türetilmiş kendi DLL uzantılarınızı çağıran veya onlardan türetilen DLL uzantılarnız varsa, belirsizliği engellemek için kendi önişlemci sembolünüzü kullanmalısınız.

Win32'deki sorun, eğer veri DLL'den dışarı aktarılıyorsa __declspec(dllexport) olarak, eğer DLL'e içeri aktarılıyorsa __declspec(dllimport) olarak her verinin açıkça bildirilmesi gerektiğidir. _AFXEXT'i tanımladığınızda, MFC üstbilgileri AFX_EXT_CLASS'ın doğru tanımlandığını garanti eder.

Varsa birden fazla katmanı, bir sembol gibi afx_ext_class bir uzantı DLL'si yeni sınıflar verme yanı sıra başka bir uzantı DLL'si diğer sınıfları içe yeterli, değildir. Bu sorunları gidermek için dll dosyasını kullanarak karşı dll kendisini oluşturmakta olduğunuz gösterir bir özel Önişlemci sembolü kullanın. Örneğin, iki uzantısı DLL'ler, a.dll ve b.dll düşünün. Bunların hepsi sırasıyla a.h ve b.h, bazı sınıflarda verin. b.dll a.dll sınıflardan kullanır. Başlık dosyaları aşağıdakilere benzer:

/* A.H */
#ifdef A_IMPL
   #define CLASS_DECL_A   __declspec(dllexport)
#else
   #define CLASS_DECL_A   __declspec(dllimport)
#endif

class CLASS_DECL_A CExampleA : public CObject
{ ... class definition ... };

/* B.H */
#ifdef B_IMPL
   #define CLASS_DECL_B   __declspec(dllexport)
#else
   #define CLASS_DECL_B   __declspec(dllimport)
#endif

class CLASS_DECL_B CExampleB : public CExampleA
{ ... class definition .. };

a.dll oluþturulduðunda ile günceldir /d A_IMPL ve b.dll oluþturulduðunda ile günceldir /d B_IMPL. Her dll için ayrı semboller kullanarak CExampleB verilir ve CExampleA b.dll oluştururken alınır. CExampleA a.dll oluşturulurken verilen ve b.dll (veya başka bir istemci) kullanıldığı zaman alınır.

Bu tür katmanlarını yapılamaz, yerleşik kullanırken afx_ext_class ve _AFXEXT önişlemci simgeleri. Yukarıda açıklanan tekniği mfc kendisi, ole, veritabanı ve ağ uzantı DLL'leri oluştururken düzeneğini bir şekilde değil aksine bu sorunu çözer.

hw85e4bb.collapse_all(tr-tr,VS.110).gifBütün Sınıfı Dışarı Aktarmama

Tüm bir sınıf verildiğinde değil özel dikkatli gerekecektir. mfc makrolar tarafından oluşturulan gerekli veri öğelerini doğru şekilde dışa sağlamak zorunda. Bu re-defining tarafından yapılabilir afx_data , özel sınıf makro. Bu bütün sınıfı dışarı aktarmadığınız bütün durumlarda yapılmalıdır.

Örne?in:

// A.H
#ifdef A_IMPL
   #define CLASS_DECL_A  _declspec(dllexport)
#else
   #define CLASS_DECL_A  _declspec(dllimport)
   #endif

#undef  AFX_DATA
#define AFX_DATA CLASS_DECL_A

class CExampleA : public CObject
{
   DECLARE_DYNAMIC()
   CLASS_DECL_A int SomeFunction();
   //class definition 
   .
   .
   .
};

#undef AFX_DATA
#define AFX_DATA

hw85e4bb.collapse_all(tr-tr,VS.110).gifDllMain

Uzantı DLL'si için ana kaynak dosyanızı yerleştirmelisiniz tam kodu aşağıdadır. Standart yükleme sonra gelmeli. Başlatıcı uzantısı dll dosyalarını oluşturmak için AppWizard kullandığınızda, bunun sağladığı Not bir DllMain sizin için.

#include "afxdllx.h"

static AFX_EXTENSION_MODULE extensionDLL;

extern "C" int APIENTRY 
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
   if (dwReason == DLL_PROCESS_ATTACH)
   {
      // Extension DLL one-time initialization 
      if (!AfxInitExtensionModule(
             extensionDLL, hInstance))
         return 0;

      // TODO: perform other initialization tasks here
   }
   else if (dwReason == DLL_PROCESS_DETACH)
   {
      // Extension DLL per-process termination
      AfxTermExtensionModule(extensionDLL);

          // TODO: perform other cleanup tasks here
   }
   return 1;   // ok
}

Çağrı AfxInitExtensionModule modüller çalışma zamanı sınıfları yakalayan (CRuntimeClass yapıları) yanı sıra, nesne fabrikaları (COleObjectFactory nesneleri) kullanmak için sonraki zaman CDynLinkLibrary nesnesi oluşturulur. (İsteğe bağlı) çağrısı AfxTermExtensionModule her işlem ayırır, mfc Temizleme için uzantı DLL'si verir. (işlemden çıkıldığında ya da dll sonucunda kaldırıldı olacağını bir FreeLibrary çağrısı) uzantısı DLL'den. Çoğu uzantı DLL dosyalarını dinamik olarak yüklenmez itibaren (genellikle, bunlar kendi alma kitaplıkları ile bağlantılıdır), çağrı AfxTermExtensionModule genellikle gerekli değildir.

Uygulama yükler ve uzantı DLL dosyalarını dinamik olarak açar, çağırdığınızdan emin olun AfxTermExtensionModule yukarıda gösterildiği gibi. Kullandığınızdan emin olun AfxLoadLibrary ve AfxFreeLibrary (Win32 işlevlerini yerine LoadLibrary ve FreeLibrary) birden çok iş parçacığı uygulama kullanıyorsa veya dinamik olarak bir uzantı dll yükler. Kullanarak AfxLoadLibrary ve AfxFreeLibrary insures uzantısı dll yüklendi ve kaldırıldı yürütülen başlatma ve kapatma kodu Genel mfc durumu bozuk değil.

Üstbilgi dosyası afxdllx.H özel tanımı gibi uzantısı DLL'ler kullanılan yapıları tanımları içeren AFX_EXTENSION_MODULE ve CDynLinkLibrary.

Genel extensionDLL gösterilen bildirilmelidir. 16-Bit sürümünü mfc, bellek ve MFCxx.DLL zaman tam olarak başlatılmış olduğundan bu süre içinde çağrı mfc işlevleri kullanabilirsiniz, DllMain olarak adlandırılır.

hw85e4bb.collapse_all(tr-tr,VS.110).gifKaynakları ve Sınıfları Paylaşma

Basit mfc uzantısı DLL'ler yalnızca birkaç düşük bant genişlikli işlevler istemci uygulaması ve hiçbir şey daha fazla dışarı. Daha fazla kullanıcı arabirimi yoğun DLL'leri kaynakları ve C++ sınıflarını istemci uygulamasına vermek isteyebilirsiniz.

Kaynakların dışarı aktarılması bir kaynak listesi üzerinden yapılır. Her iki uygulamada tek olarak bağlantılı listesidir CDynLinkLibrary nesneler. Kaynakları yüklenemiyor standart mfc uygulamaları çoğu için kaynak ararken geçerli kaynak modül ilk arayın (AfxGetResourceHandle) ve Yürüme bulunamadı listesini CDynLinkLibrary nesneleri istenen kaynak yüklenmeye çalışılıyor.

Dinamik bir C++ sınıf adı verilen C++ nesneleri oluşturulmasını benzer. mfc nesnesi serisini kaldırma mekanizması tüm olması gerekiyor CRuntimeClass nesneleri kayıtlı böylece ne daha önce saklanan üzerinde temel gerekli tür C++ nesne oluşturarak dinamik olarak yeniden.

İstemci uygulaması olan, dll uzantılı sınıfları kullanmak istiyorsanız, DECLARE_SERIAL, sonra sınıflarınızı istemci uygulaması tarafından görülebilir vermeniz gerekir. Bu da, yürüyen tarafından yapılır CDynLinkLibrary listesi.

mfc Gelişmiş kavram örnek olması durumunda, dllhusk, liste aşağıdaki gibi arar:

head ->   DLLHUSK.EXE   - or -   DLLHUSK.EXE
               |                      |
          TESTDLL2.DLL           TESTDLL2.DLL
               |                      |
          TESTDLL1.DLL           TESTDLL1.DLL
               |                      |
               |                      |
            MFC90D.DLL            MFC90.DLL

Genellikle kaynak ve sınıf listesi son MFCxx.DLL. MFCxx.DLL komut isteminde dizeleri için standart komut kimlikleri de dahil olmak üzere standart mfc kaynakların tümünü içerir. Liste tail at yerleştirerek sağlar DLL'leri ve sahip istemci uygulaması kendisini bir MFCxx.DLL paylaşılan kaynakları yerine güvenir üzere ancak standart mfc kaynak, kendi kopyasını.

Sınıf adları tüm dll dosyaları ve kaynakları istemci uygulamanın ad alanı birleştirme hangi kimlikleri dikkatli olması Dezavantaj veya adları, çekme vardır. Kuşkusuz bu özellik ya da vererek değil kaynaklarınızın getirebilirsiniz ya da bir CDynLinkLibrary istemci uygulama nesnesi. DLLHUSK örneği paylaşılan kaynak adı alanını çoklu başlık dosyalarını kullanarak yönetir. Bakın Teknik Not 35 paylaşılan kaynak dosyalarını kullanma hakkında daha fazla ipucu için.

hw85e4bb.collapse_all(tr-tr,VS.110).gifdll başlatılıyor

Yukarıda belirtildiği gibi genellikle oluşturmak istediğiniz bir CDynLinkLibrary kaynaklar ve sınıfları istemci uygulamasına aktarmak için nesne. Dll dosyasını başlatmak için verilen girdi noktası sağlamanız gerekir. En az, bu hiçbir şey hiçbir baðýmsýz deðiþken almaz ve void yordamı, ancak istediğiniz herhangi bir şey olabilir.

Bu yaklaşımı kullanırsanız, dll dosyanızın kullanmak istediği her istemci uygulaması bu başlatma yordamı çağırması gerekir. Ayrıca bu tahsis CDynLinkLibrary , nesne, DllMain hemen sonra arama AfxInitExtensionModule.

Başlatma yordamı oluşturmanız gerekir bir CDynLinkLibrary uzantısı dll bilgi kadar kablolu geçerli uygulamanın yığın nesnesi. Bu aşağıdakileri gerçekleştirebilirsiniz:

extern "C" extern void WINAPI InitXxxDLL()
{
   new CDynLinkLibrary(extensionDLL);
}

Rutin adı InitXxxDLL Bu örnekte, istediğiniz herhangi bir şey olabilir. Olması gerekmez extern "C", ancak bunu yapar verme listesi Bakımı daha kolay yapmak.

Not

Kendi uzantısı dll normal bir dll dosyasından kullanırsanız, bu başlatma işlevi vermelisiniz.Bu işlev normal dll dosyasından herhangi bir uzantısı dll sınıfları veya kaynakları kullanmadan önce çağrılması gerekir.

hw85e4bb.collapse_all(tr-tr,VS.110).gifGirişleri dışa aktarma

Kendi sınıfları dışa aktarmak için basit yolu __declspec(dllimport) ve __declspec(dllexport) her sınıf ve dışa aktarmak istediğiniz genel işlev. Bu çok daha kolay hale getirir ama fonksiyonları verilen daha az denetim sahibi ve sıralı işlevleri verilemiyor beri her giriş noktası (aşağıda açıklanan) adlandırma'den daha az verimlidir. TESTDLL1 ve TESTDLL2 girilerini vermek için bu yöntemi kullanın.

Daha verimli bir yöntem (ve MFCxx.DLL tarafından kullanılan yöntem) her girdi el ile her girişte adlandırarak vermektir.def dosyası. Seçmeli verir bizim DLL'SİNDE (yani değil herşey) veriyorsunuz bu yana biz hangi belirli arabirimleri dışa aktarmak istediğiniz karar vermeniz gerekir. Beri girişleri formunda linker karıştırılmış adları belirlemek zor olmasıdır.def dosyası. Sembolik bağlantı olması gerçekten gerekli olmadıkça herhangi bir C++ sınıflarını vermeyin.

Bunu denediyseniz C++ verme ile sınıfları bir.def, bu liste otomatik olarak oluşturmak için bir araç geliştirmek istediğiniz önce dosya. Bu işlem iki aşama bağlama işlemini kullanma. dll hiçbir verir kez ile bağlamak ve bağlayıcısı oluşturmak izin bir.EŞLEME dosyası. .EŞLEME dosyası yeniden bazı düzenleme ile bunu ihracat girdileri oluşturmak için kullanılacak şekilde verilmeli, işlevlerin listesini oluşturmak için kullanılabilir.def dosyası. (Tamamen otomatik değildir ve bazı el her bir kez bir süre ayarlama gerektiren rağmen) verme listesi MFCxx.DLL ve ole Veritabanı uzantısı DLL'ler birkaç bin sayısı, böyle bir işlemle üretildi.

hw85e4bb.collapse_all(tr-tr,VS.110).gifCWinApp vs.CDynLinkLibrary

mfc uzantısı dll sahip olmadığı bir CWinApp-türetilen nesne kendi; Bunun yerine ile çalışmalısınız CWinApp-istemci uygulamasının nesne türetilmiş. Bu istemci uygulaması ana ileti pompasına ihtiyaç işlevsiz döngü vb. sahibi anlamına gelir.

mfc uzantısı dll her uygulama için ek verileri korumak gerekiyorsa, yeni bir sýnýftan türemesine CDynLinkLibrary ve yukarıdaki yordamı açıklamak InitXxxDLL oluşturun. Çalışırken DLL o özel uzantı DLL'si için bir tane bulmak üzere geçerli uygulamanın CDynLinkLibrary nesneleri listesini denetleyebilir.

hw85e4bb.collapse_all(tr-tr,VS.110).gifdll uygulamanızda kaynakları kullanma

Yukarıda belirtildiği gibi varsayılan kaynak yükleme listesini yükselteceğinizi CDynLinkLibrary ilk exe veya istenen kaynak dll arayan nesneler. Tüm mfc API'leri yanı iç kod kullanan tüm AfxFindResourceHandle burada bulunabilir olsun herhangi bir kaynak bulmak üzere kaynak listesi gitmeye.

Yalnızca belirli bir yerden kaynakları yüklemek isterseniz API'leri kullanan AfxGetResourceHandle ve AfxSetResourceHandle eski tanıtıcı Kaydet ve yeni tutamaç. İstemci uygulamasına dönmeden önce eski kaynak tanıtıcısını geri yüklediğinizden emin olun. TESTDLL2 örnek menü açıkça yüklemek için bu yaklaşım kullanır.

Listenin üzerinden gitmenin biraz daha yavaş olması ve kaynak kimlik aralıklarını yönetmeyi gerektirmesi gibi dezavantajları vardır. Birkaç uzantı DLL dosyasına bağlanan istemci uygulaması herhangi bir DLL tarafından sağlanan kaynağı, DLL örneği işleyicisi belirtmeye gerek kalmadan kullanabilme avantajına sahiptir. AfxFindResourceHandle, kaynak listesini verilen bir eşleşmeyi aramaya sevk etmek için kullanılan bir API'dır. Bir kaynağın adını ve türünü alır ve kaynak işleyicisini ilk bulunduğu yere döndürür (veya NULL).

dll sürümü kullanan bir uygulama yazma

hw85e4bb.collapse_all(tr-tr,VS.110).gifUygulama gereksinimleri

mfc paylaşılan sürümünü kullanan bir uygulama, birkaç basit kurallara uymalıdır:

  • Olması gereken bir CWinApp nesne ve mesaj pompasına ihtiyaç için standart kurallar izler.

  • Gerekli derleyici bayraklar (aşağıya bakın) bir dizi derlenmelidir.

  • MFCxx alma kitaplıklarıyla Bağla gerekir. mfc üstbilgileri gerekli derleyici bayrakları ayarlayarak, bağlantı zaman hangi kitaplık uygulaması ile bağlanmalıdır belirler.

  • Yürütülebilir dosyayı çalıştırmak için MFCxx.DLL yol ya da Windows Sistem dizini olmalıdır.

hw85e4bb.collapse_all(tr-tr,VS.110).gifGeliştirme ortamı oluşturma

İç makefile standart varsayılan ayarlar çoğu ile kullanıyorsanız, proje dll sürümünü oluşturmak için kolayca değiştirebilirsiniz.

Aşağıdaki adımı, doğru düzgün bir mfc uygulaması ile nafxcwd bağlı olduğu varsayılır.LIB (debug için) ve nafxcw.(Perakende için) LIB ve mfc kitaplık paylaşılan sürümünü kullanmak için dönüştürmek istiyorsanız. Dahili proje dosyanız ve Visual C++ ortamında çalıştırıyorsunuz.

  1. Üzerinde projeleri menüsünde'ı özelliklerini. İçinde Genel altında sayfa Project varsayılan olarak, Microsoft temel sınıfları ayarlamak , Paylaşılan dll mfc kullanımı (MFCxx(d).dll).

hw85e4bb.collapse_all(tr-tr,VS.110).gifnmake ile oluşturma

Visual C++'ın dış makefile özelliğini kullanarak veya nmake doğrudan kullanarak, derleyici ve bağlayıcı seçeneklerini desteklemek için kendi makefile düzenlemek gerekir

Gerekli derleyici bayrakları:

  • / D_AFXDLL /MD
    / D_AFXDLL

Standart mfc üstbilgileri bu sembole tanımlanması gerekir:

  • /MD
    Uygulama c çalışma zamanı kitaplığı dll sürümünü kullanmanız gerekir

Diğer derleyici bayrakları mfc varsayılan değerleri (örneğin, _debug hata ayıklama) izleyin.

Kitaplık linker listesini düzenleyin. Değişiklik nafxcwd.MFCxxD.LIB için LIB ve nafxcw değiştirin.LIB MFCxx.LIB için. LIBC değiştirin.İle msvcrt LIB.LIB. Diğer bir mfc kitaplık ile MFCxxD.LIB yerleştirilir önemli olduğu gibi önce herhangi bir c çalışma zamanı kitaplıkları.

İsteğe bağlı olarak ekleme /d_afxdll hem perakende hem de hata ayıklama kaynağı derleyici seçenekleri (aslında kaynaklarla derler bir /r). Bu son dosyanýzý mfc DLL'lerin var olan kaynakları paylaşarak küçültür.

Bu değişiklikler yapıldıktan sonra tam bir yeniden gereklidir.

hw85e4bb.collapse_all(tr-tr,VS.110).gifÖrnekleri oluşturma

mfc örnek programların çoğu, Visual C++ ya da komut satırından paylaşılan bir nmake uyumlu MAKEFILE yerleşik.

Herhangi bir MFCxx.DLL kullanmak için bu örnekleri dönüştürmek, yükleyebilirsiniz.mak, Visual C++ dosya ve yukarıda açıklandığı gibi proje seçeneklerini ayarlayın. nmake yapı kullanıyorsanız, belirtebileceğiniz "afxdll = 1" üzerinde nmake komut satırı ve paylaşılan mfc kitaplıklarını kullanarak örnek oluşturacak.

mfc Gelişmiş kavram örnek dllhusk mfc dll sürümü ile oluşturulmuştur. Bu örnek yalnızca MFCxx.DLL ile bağlantılı bir uygulamalarının nasıl oluşturulacağını göstermektedir, ancak dll mfc paketleme seçeneğinin mfc uzantısı DLL'ler, daha sonra bu teknik notta açıklandığı gibi diğer özellikleri de göstermektedir.

hw85e4bb.collapse_all(tr-tr,VS.110).gifAmbalaj notları

Perakende sürümünü dll ([u] MFCxx.dll) olan serbestçe dağıtılabilir. Hata ayıklama dll sürümünü serbestçe dağıtılabilir değildir ve yalnızca uygulama geliştirme sırasında kullanılmalıdır.

Dll hata ayıklama hata ayıklama bilgileri sağlanır. Visual C++ hata ayıklayıcısı kullanarak, dll yanı sıra uygulamanızın çalışmasını izleyebilirsiniz. Yayın dll ([u] MFCxx.dll) hata ayıklama bilgileri içermez.

Özelleştirmek veya dll dosyalarını yeniden, daha sonra bunları bir şey mfcdll "MFCxx" mfc kaynak dosyası dışında çağırmalıdır.mak, yapý seçenekleri açıklar ve dll dosyasını yeniden adlandırmak için mantığı içerir. Beri bu DLL'lerin sağlayabilecek birçok mfc uygulamaları tarafından paylaşılan dosyaları yeniden adlandırma, gereklidir. Özel dll mfc Değiştir sürümünüz bulunması bu sistemde yüklü başka bir mfc uygulaması kullanarak paylaşılan DLL'lerin mfc çalışmamasına neden olabilir.

mfc dll dosyalarını yeniden önerilmez.

MFCxx.DLL nasıl uygulanır

mfc dll (MFCxx.DLL ve MFCxxD.DLL) nasıl gerçekleştirilir aşağıdaki bölümde açıklanmaktadır. Ayrıntılar burada da değildir anlamak tüm yapmak isterseniz mfc dll ile uygulamanızı kullanmak önemlidir. Ayrıntılar burada dll mfc uzantı yazmak için gerekli değildir ancak bu uygulama anlama kendi dll yazmanıza yardımcı olabilir.

hw85e4bb.collapse_all(tr-tr,VS.110).gifUygulama genel bakış

mfc gerçekten mfc uzantı DLL'si, özel bir durum yukarıda açıklandığı gibi dll'dir. Çok sayıda çok sayıda sınıf verir var. Normal bir uzantı DLL'si daha özel kılan mfc dll bunu birkaç ek işlemler vardır.

hw85e4bb.collapse_all(tr-tr,VS.110).gifWin32 işin çoğunu yapar.

-App veri yığın kesiminin bazı 80 x 86 assembly kodu, işlem içi özel içerik ve diğer teknikler tarafından oluşturulan özel parçaları dahil olmak üzere özel teknikler sayısı mfc 16-bit sürümü gerekli. Win32 doğrudan işlem içi verileri bir dll dosyası, çoğu zaman istediğiniz olduğu destekler. Çoğu yalnızca nafxcw MFCxx.DLL olur.dll içinde paketlenmiş LIB. mfc kaynak koda bakarsanız, yapılması gereken özel durumlarda çok az olduğundan çok az #ifdef _afxdll bulacaksınız. Vardır özellikle Windows 3.1 (aksi halde Win32s da bilinir), Win32 dağıtılacak olan özel durumlar. İş parçacığı yerel depolama (tls) işlemi yerel verileri elde etmek için Win32 API dll mfc böylece kullanmalısınız doğrudan Win32s değil destek işlem dll verileri yapar.

hw85e4bb.collapse_all(tr-tr,VS.110).gifKütüphane kaynakları, ek dosyalar üzerindeki etkisi

Etkisini _afxdll görece önemsiz sürüm normal mfc sınıf kitaplığı kaynakları ve üstbilgileri. Özel sürüm dosya (afxv_dll.h) ek üstbilgi dosyası (afxdll_ yanı sıra.h) dahil ana AFXWIN.H başlığı. afxdll_.H üstbilgi içeren CDynLinkLibrary sınıf ve diğer uygulama ayrıntılarını ikisinin _afxdll uygulamaları ve mfc uzantısı DLL. afxdllx.H üstbilgi mfc uzantısı dll (Ayrıntılar için bkz.yukarıda) oluşturmak için sağlanmıştır.

Bazı ek koşullu kod altında normal mfc src mfc kitaplık kaynaklarına sahip _afxdll #ifdef. Bir ek kaynak dosyası (DLLINIT.cpp) fazladan dll başlatma kodu ve diğer bağlantılı mfc paylaşılan sürümü içerir.

mfc paylaşılan sürümünü oluşturmak için ek dosyaları sağlanır. (Aşağıdaki dll oluşturma konusunda ayrıntılı bilgi için bkz.)

  • İki.def dosyaları (MFCxxD.DEF) hata ayıklama dll mfc giriş noktaları dışa aktarmak için kullanılan ve dll sürümlerini (MFCxx.DEF) bırakın.

  • Bir.rc dosya (mfcdll.rc) standart mfc kaynak ve VERSIONINFO kaynak dll dosyasını içerir.

  • A.clw dosya (mfcdll.clw) sınıfları ClassWizard kullanarak mfc taranmasına izin vermek amacıyla sağlanmıştır. Not: Bu özellik, belirli mfc dll sürümü değil.

hw85e4bb.collapse_all(tr-tr,VS.110).gifBellek Yönetimi

MFCxx.DLL kullanan bir uygulama MSVCRTxx.DLL, paylaşılan dll c çalışma zamanı tarafından sağlanan ortak bir bellek ayırıcısı kullanır. Uygulama, herhangi bir uzantı DLL'leri ve mfc DLL'ler olarak iyi bu paylaşılan bellek ayırıcı kullanın. mfc DLL'leri bellek ayırma için paylaşılan DLL'i kullanarak, daha sonra uygulama tarafından veya serbest bellek ayırabilirsiniz. Aynı ayırıcısı, uygulama ve dll kullanmanız gerekir çünkü, global C++ kılmalıdır operator new veya operator delete. c çalışma zamanı bellek ayırma düzenleri geri kalanı için aynı kurallar geçerlidir (gibi malloc, realloc, ücretsizve diğerleri).

hw85e4bb.collapse_all(tr-tr,VS.110).gifSıra sayılarını ve sınıf __declspec(dllexport) ve dll adlandırma

Biz kullanma class**__declspec(dllexport)** işlevselliğini C++ derleyicisi. Bunun yerine, bir listesini verir, sınıf kitaplığı kaynaklarıyla (MFCxx.DEF ve MFCxxD.DEF) bulunur. Giriş noktalarını (işlevler ve veri) select bu kümesini dışa. mfc uygulaması özel işlevler veya sınıfları gibi diğer simgeler verilmemiş tüm verir yerleşik veya yerleşik olmayan ad tablosunda dize adı olmadan bir sıraya göre yapılır.

Kullanarak class**__declspec(dllexport)** küçük dll oluşturma, ancak büyük bir dll mfc, varsayılan verme mekanizması gibi durumunda, güvenilir bir alternatif olan verimlilik ve kapasite olarak sınırlar.

Tüm Bunun anlamı nedir biz işlevselliği, yalnızca yaklaşık 800 kadar yürütme tehlikeye veya hızlı yükleme olmadan kb MFCxx.DLL sürümdeki büyük miktarda paketleyebilirsiniz. MFCxx.DLL edilmiştir 100 k büyük bu tekniği değil edilmiş kullanılır. Bu da, sonunda ek giriş noktaları eklemek mümkün kılar.Basit sürüm sıralı verme hızı ve boyutu verimlilik ödün vermeksizin izin def belirtir. Ana sürüm değişiklikleri mfc sınıf kitaplığı kitaplık adı değiştirilir. Yani, MFC30.dll mfc class library 3.0 sürümünü içeren yeniden dağıtılabilir dll'dir. Bu dll yükseltmesi söyleyin, varsayımsal bir mfc 3.1 dll MFC31 adlı.dll yerine. Özel bir mfc dll sürümü üretmeye mfc kaynak kodunu değiştirirseniz, yeniden, farklı bir ad (ve tercihen "mfc" olmayan) adını kullanın.

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar