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 CDialog
sı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_DATA
ile 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?
C dili yürütülebilir dosyalarda kullanmak üzere C++ işlevlerini dışarı aktarma
C veya C++dil yürütülebilir dosyalarında kullanmak üzere C işlevlerini dışarı aktarma
Ne hakkında daha fazla bilgi edinmek istiyorsunuz?
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin