Aracılığıyla paylaş


AFX_EXT_CLASS Kullanarak Dışa ve İçe Aktarma

Uzantı DLL'ler sınıfları dışa aktarmak için AFX_EXT_CLASS makrosunu kullanır, uzantı DLL'lere bağlanan çalıştırılabilirler sınıfları içe aktarmak için makro kullanır. AFX_EXT_CLASS makrosuyla birlikte, uzantı DLL'i oluşturmada kullanılan aynı başlık dosyaları DLL'e bağlanan çalıştırılabilirlerle kullanılabilir.

DLL'inizin başlık dosyasında, sınıfınızın bildirimine AFX_EXT_CLASS anahtar sözcüğünü aşağıdaki gibi ekleyin:

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

Bu makro, _AFXDLL ve _AFXEXT önişlemci simgeleri tanımlandığında MFC tarafından __declspec(dllexport) olarak tanımlanır. Ancak makro, _AFXDLL tanımlandığında ve _AFXEXT tanımlanmadığında __declspec(dllimport) olarak tanımlanır. Tanımlandığında, _AFXDLL önişlemci simgesi MFC'nin paylaşılan sürümünün hedef çalıştırılabilir (DLL ya da uygulama) tarafından kullanıldığını belirtir. _AFXDLL'in ve _AFXEXT'in ikisi birden tanımlandığında, bu hedef çalıştırılabilirin bir uzantı DLL olduğunu belirtir.

AFX_EXT_CLASS __declspec(dllexport) olarak tanımlandığından, uzantı DLL'den dışa aktarırken bütün sınıfı, o sınıfın simgeleri için olan düzenlenmiş adları .def dosyasına koymadan dışa aktarabilirsiniz. Bu yöntem MFC DLLHUSK örneğinde kullanılmıştır.

Bu yöntemle .def dosyası ve sınıf için bütün düzenlenmiş adları oluşturmaktan kaçınabilmenize rağmen, isimler sıralı olarak dışa aktarılabildiğinden .def dosyası oluşturmak daha verimlidir. .def dosyası dışa aktarma yöntemini kullanmak için, aşağıdaki kodu başlık dosyanızın başına ve sonuna yerleştirin:

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

Satır içi işlevleri dışa aktarırken dikkatli olun çünkü, sürüm çatışması ihtimali oluştururlar. Satır içi işlevi uygulama kodunun içine genişletilir, bu sebeple, eğer işlevi daha sonra yeniden yazarsanız uygulamanın kendisi tekrar derlenmeden işlev güncellenmez. Normalde, DLL işlevleri kendisini kullanan uygulamalar tekrar derlenmeden güncellenebilir.

Sınıftaki Üyeleri Tek Tek Dışa Aktarma

Bazen sınıfınızdaki üyeleri tek tek dışa aktarmak isteyebilirsiniz. Örneğin, CDialog türetilmiş sınıfını dışa aktarıyorsanız, sadece oluşturucuyu ve DoModal çağrısını dışa aktarmanız gerekebilir. AFX_EXT_CLASS'ı dışa aktarmanız gereken bağımsız üyelerde kullanabilirsiniz.

Örneğin:

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

Artık sınıfın bütün üyelerini dışa aktarmadığınızdan, MFC makrolarının çalışma şeklinden dolayı ek sorunlarla karşılaşabilirsiniz. Aslında MFC'nin yardımcı makrolarının çoğu veri üyelerini bildirir veya tanımlar. Bu sebeple, bu veri üyeleri de DLL'inizden dışa aktarılmalıdır.

Ö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; \

Statik AFX_DATA ile başlayan satır, sınıfınızın içinde statik nesne bildiriyor. Bu sınıfı doğru şekilde dışa aktarmak ve istemci çalıştırılabilirden çalışma zamanı bilgilerine erişmek için bu statik nesneyi de dışa aktarmalısınız. 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. AFX_EXT_CLASS zaten bu şekilde tanımlandığından, siz sadece sınıf tanımınızın etrafında AFX_DATA'yı AFX_EXT_CLASS ile aynı olacak şekilde yeniden tanımlamalısınız.

Ö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 kendi makrosunda tanımladığı veri öğelerinde her zaman AFX_DATA simgesini kullandığından, bu yöntem benzeri her senaryo için çalışır. Örneğin, DECLARE_MESSAGE_MAP için çalışır.

Not

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

Ne yapmak istiyorsunuz?

Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Kavramlar

DLL'den Dışa Aktarma