Bagikan melalui


Mengekspor dan Mengimpor Menggunakan AFX_EXT_CLASS

DLL ekstensi MFC menggunakan AFX_EXT_CLASS makro untuk mengekspor kelas; executable yang ditautkan ke DLL ekstensi MFC menggunakan makro untuk mengimpor kelas. Dengan makro AFX_EXT_CLASS, file header yang sama yang digunakan untuk membangun DLL ekstensi MFC dapat digunakan dengan file yang dapat dieksekusi yang ditautkan ke DLL.

Di file header untuk DLL Anda, tambahkan kata kunci AFX_EXT_CLASS ke deklarasi kelas Anda sebagai berikut:

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

Makro ini didefinisikan oleh MFC seperti __declspec(dllexport) ketika simbol praprosesor _AFXDLL dan _AFXEXT didefinisikan. Tetapi makro didefinisikan sebagai __declspec(dllimport) kapan _AFXDLL didefinisikan dan _AFXEXT tidak didefinisikan. Ketika didefinisikan, simbol _AFXDLL pra-prosesor menunjukkan bahwa versi bersama MFC sedang digunakan oleh target yang dapat dieksekusi (baik DLL atau aplikasi). Ketika dan _AFXDLL_AFXEXT didefinisikan, ini menunjukkan bahwa target yang dapat dieksekusi adalah DLL ekstensi MFC.

Karena AFX_EXT_CLASS didefinisikan sebagai __declspec(dllexport) saat mengekspor dari DLL ekstensi MFC, Anda dapat mengekspor seluruh kelas tanpa menempatkan nama yang didekorasi untuk semua simbol kelas tersebut dalam file .def.

Meskipun Anda dapat menghindari pembuatan file .def dan semua nama yang didekorasi untuk kelas dengan metode ini, membuat file .def lebih efisien karena nama dapat diekspor secara ordinal. Untuk menggunakan metode ekspor file .def, letakkan kode berikut di awal dan akhir file header Anda:

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

Perhatian

Berhati-hatilah saat mengekspor fungsi sebaris, karena dapat menciptakan kemungkinan konflik versi. Fungsi sebaris diperluas ke dalam kode aplikasi; oleh karena itu, jika Anda kemudian menulis ulang fungsi, itu tidak diperbarui kecuali aplikasi itu sendiri dikompresi ulang. Biasanya, fungsi DLL dapat diperbarui tanpa membangun kembali aplikasi yang menggunakannya.

Mengekspor Anggota Individu di Kelas

Terkadang Anda mungkin ingin mengekspor masing-masing anggota kelas Anda. Misalnya, jika Anda mengekspor CDialogkelas -turunan, Anda mungkin hanya perlu mengekspor konstruktor dan DoModal panggilan. Anda dapat menggunakan AFX_EXT_CLASS pada masing-masing anggota yang perlu Anda ekspor.

Contohnya:

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

Karena Anda tidak lagi mengekspor semua anggota kelas, Anda mungkin mengalami masalah tambahan karena cara kerja makro MFC. Beberapa makro pembantu MFC benar-benar mendeklarasikan atau menentukan anggota data. Oleh karena itu, anggota data ini juga harus diekspor dari DLL Anda.

Misalnya, makro didefinisikan DECLARE_DYNAMIC sebagai berikut saat membangun DLL ekstensi MFC:

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

Garis yang dimulai dengan statis AFX_DATA mendeklarasikan objek statis di dalam kelas Anda. Untuk mengekspor kelas ini dengan benar dan mengakses informasi run-time dari klien yang dapat dieksekusi, Anda harus mengekspor objek statis ini. Karena objek statis dideklarasikan dengan pengubah AFX_DATA, Anda hanya perlu mendefinisikan AFX_DATA menjadi __declspec(dllexport) saat membangun DLL Anda dan mendefinisikannya seperti __declspec(dllimport) saat membangun klien Anda yang dapat dieksekusi. Karena AFX_EXT_CLASS sudah didefinisikan dengan cara ini, Anda hanya perlu mendefinisikan AFX_DATA ulang agar sama seperti AFX_EXT_CLASS di sekitar definisi kelas Anda.

Contohnya:

#undef  AFX_DATA
#define AFX_DATA AFX_EXT_CLASS

class CExampleView : public CView
{
   DECLARE_DYNAMIC()
   // ... class definition ...
};

#undef  AFX_DATA
#define AFX_DATA

Karena MFC selalu menggunakan AFX_DATA simbol pada item data yang ditentukannya dalam makronya, teknik ini berfungsi untuk semua skenario tersebut. Misalnya, ini berfungsi untuk DECLARE_MESSAGE_MAP.

Catatan

Jika Anda mengekspor seluruh kelas daripada anggota kelas yang dipilih, anggota data statis akan diekspor secara otomatis.

Apa yang ingin Anda lakukan?

Apa yang ingin Anda ketahui lebih lanjut?

Baca juga

Mengekspor dari DLL