Aracılığıyla paylaş


AFX_EXT_CLASS Kullanarak İçeri ve Dışarı Aktarma

MFC uzantısı DLL'leri sınıfları dışarı aktarmak için makro AFX_EXT_CLASS kullanır; MFC uzantısı DLL'sine bağlanan yürütülebilir dosyalar, sınıfları içeri aktarmak için makroyu kullanır. AFX_EXT_CLASS makroyla, MFC uzantısı DLL'sini oluşturmak için kullanılan üst bilgi dosyaları, DLL'ye bağlanan yürütülebilir dosyalarla birlikte kullanılabilir.

DLL'nizin üst bilgi dosyasında AFX_EXT_CLASS anahtar sözcüğünü sınıfınızın bildirimine aşağıdaki gibi ekleyin:

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

Bu makro MFC tarafından önişlemci sembolleri _AFXDLL ve _AFXEXT tanımlandığı zaman olarak __declspec(dllexport) tanımlanır. Ancak makro tanımlandığı zaman _AFXDLL olarak __declspec(dllimport) tanımlanır ve _AFXEXT tanımlanmaz. Tanımlandığında, ön işlemci simgesi _AFXDLL MFC'nin paylaşılan sürümünün hedef yürütülebilir dosya (DLL veya uygulama) tarafından kullanıldığını gösterir. Hem hem de _AFXDLL_AFXEXT tanımlandığında, hedef yürütülebilir dosyanın bir MFC uzantısı DLL'i olduğunu gösterir.

AFX_EXT_CLASS Bir MFC uzantı DLL'sinden dışarı aktarırken olarak __declspec(dllexport) tanımlandığından, tüm sınıf simgelerinin süslü adlarını .def dosyasına yerleştirmeden tüm sınıfları dışarı aktarabilirsiniz.

Bu yöntemle bir .def dosyası ve sınıfın tüm süslü adlarını oluşturmaktan kaçınabilirsiniz, ancak adlar sıralı olarak dışarı aktarılabildiğinden .def dosyası oluşturmak daha verimlidir. Dışarı aktarma işleminin .def dosyası yöntemini kullanmak için, üst bilgi dosyanızın başına ve sonuna aşağıdaki kodu yerleştirin:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Dikkat

Satır içi işlevleri dışarı aktarırken dikkatli olun çünkü bunlar sürüm çakışması olasılığı oluşturabilir. Satır içi bir işlev uygulama koduna genişletildi; bu nedenle, daha sonra işlevi yeniden yazarsanız, uygulamanın kendisi yeniden derlenmediği sürece güncelleştirilmez. Normalde DLL işlevleri, bunları kullanan uygulamalar yeniden derlenmeden güncelleştirilebilir.

Bir SınıftaKi Tek Tek Üyeleri Dışarı Aktarma

Bazen sınıfınızın tek tek üyelerini dışarı aktarmak isteyebilirsiniz. Örneğin, türetilmiş bir CDialogsınıfı dışarı aktarıyorsanız, yalnızca oluşturucuyu ve çağrıyı DoModal dışarı aktarmanız gerekebilir. Dışarı aktarmanız gereken tek tek üyeler üzerinde kullanabilirsiniz AFX_EXT_CLASS .

Örnek:

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

Artık sınıfın tüm üyelerini dışarı aktarmadığınız için, MFC makrolarının çalışma şekli nedeniyle ek bir sorunla karşılaşabilirsiniz. MFC'nin yardımcı makrolarından birkaçı aslında veri üyelerini bildirir veya tanımlar. Bu nedenle, bu veri üyeleri dll'nizden de dışarı aktarılmalıdır.

Örneğin, DECLARE_DYNAMIC MFC uzantı DLL'sini oluştururken makro 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; \

Statik AFX_DATA ile başlayan çizgi, sınıfınızın içinde statik bir nesne bildiriyor. Bu sınıfı doğru bir şekilde dışarı aktarmak ve istemci yürütülebilir dosyalarından çalışma zamanı bilgilerine erişmek için bu statik nesneyi dışarı aktarmanız gerekir. Statik nesne değiştirici AFX_DATAile bildirildiğinden, yalnızca DLL'nizi oluştururken olması __declspec(dllexport) gerektiğini tanımlamanız AFX_DATA ve istemci yürütülebilir dosyanızı oluştururken olduğu gibi __declspec(dllimport) tanımlamanız gerekir. AFX_EXT_CLASS Bu şekilde zaten tanımlandığından, sınıf tanımınızla aynı olacak şekilde AFX_EXT_CLASS yeniden AFX_DATA tanımlamanız yeterlidir.

Örnek:

#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 makroları içinde tanımladığı veri öğelerinde sembolünü kullandığından AFX_DATA , bu teknik tüm bu senaryolarda çalışır. Örneğin, için DECLARE_MESSAGE_MAPçalışır.

Dekont

Sınıfın seçili üyeleri yerine tüm sınıfı dışarı aktarıyorsanız, statik veri üyeleri otomatik olarak dışarı aktarılır.

Ne yapmak istiyorsunuz?

Ne hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

DLL'den Dışarı Aktarma