Menggunakan dllimport dan dllexport di Kelas C++
Khusus Microsoft
Anda dapat mendeklarasikan kelas C++ dengan dllimport
atribut atau dllexport
. Bentuk-bentuk ini menyiratkan bahwa seluruh kelas diimpor atau diekspor. Kelas yang diekspor dengan cara ini disebut kelas yang dapat diekspor.
Contoh berikut mendefinisikan kelas yang dapat diekspor. Semua fungsi anggota dan data statisnya diekspor:
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
Perhatikan bahwa penggunaan dllimport
eksplisit atribut dan dllexport
pada anggota kelas yang dapat diekspor dilarang.
kelas dllexport
Saat Anda mendeklarasikan kelas dllexport
, semua fungsi anggotanya dan anggota data statis diekspor. Anda harus memberikan definisi semua anggota tersebut dalam program yang sama. Jika tidak, kesalahan linker dihasilkan. Satu pengecualian untuk aturan ini berlaku untuk fungsi virtual murni, yang anda tidak perlu memberikan definisi eksplisit. Namun, karena destruktor untuk kelas abstrak selalu dipanggil oleh destruktor untuk kelas dasar, destruktor virtual murni harus selalu memberikan definisi. Perhatikan bahwa aturan ini sama untuk kelas yang tidak didukung.
Jika Anda mengekspor data jenis kelas atau fungsi yang mengembalikan kelas, pastikan untuk mengekspor kelas.
kelas dllimport
Saat Anda mendeklarasikan kelas dllimport
, semua fungsi anggotanya dan anggota data statis diimpor. Tidak seperti perilaku dan dllimport
dllexport
pada jenis nonclass, anggota data statis tidak dapat menentukan definisi dalam program yang sama di mana dllimport
kelas ditentukan.
Pewarisan dan Kelas yang Dapat Diekspor
Semua kelas dasar kelas yang dapat diekspor harus dapat diekspor. Jika tidak, peringatan kompilator dihasilkan. Selain itu, semua anggota yang dapat diakses yang juga merupakan kelas harus dapat diekspor. Aturan ini mengizinkan dllexport
kelas untuk mewarisi dari dllimport
kelas, dan dllimport
kelas untuk mewarisi dari dllexport
kelas (meskipun yang terakhir tidak disarankan). Sebagai aturan, semua yang dapat diakses oleh klien DLL (menurut aturan akses C++) harus menjadi bagian dari antarmuka yang dapat diekspor. Ini termasuk anggota data privat yang dirujuk dalam fungsi sebaris.
Impor/Ekspor Anggota Selektif
Karena fungsi anggota dan data statis dalam kelas secara implisit memiliki tautan eksternal, Anda dapat mendeklarasikannya dengan dllimport
atribut atau dllexport
, kecuali seluruh kelas diekspor. Jika seluruh kelas diimpor atau diekspor, deklarasi eksplisit fungsi dan data anggota sebagai dllimport
atau dllexport
dilarang. Jika Anda mendeklarasikan anggota data statis dalam definisi kelas sebagai dllexport
, definisi harus terjadi di suatu tempat dalam program yang sama (seperti dengan tautan eksternal nonclass).
Demikian pula, Anda dapat mendeklarasikan fungsi anggota dengan dllimport
atribut atau dllexport
. Dalam hal ini, Anda harus memberikan dllexport
definisi di suatu tempat dalam program yang sama.
Ada baiknya untuk mencatat beberapa poin penting mengenai impor dan ekspor anggota selektif:
Impor/ekspor anggota selektif paling baik digunakan untuk menyediakan versi antarmuka kelas yang diekspor yang lebih ketat; yaitu, satu di mana Anda dapat merancang DLL yang mengekspos lebih sedikit fitur publik dan privat daripada bahasa yang diizinkan. Ini juga berguna untuk menyempurnakan antarmuka yang dapat diekspor: ketika Anda tahu bahwa klien, menurut definisi, tidak dapat mengakses beberapa data privat, Anda tidak perlu mengekspor seluruh kelas.
Jika Anda mengekspor satu fungsi virtual di kelas, Anda harus mengekspor semuanya, atau setidaknya menyediakan versi yang dapat digunakan klien secara langsung.
Jika Anda memiliki kelas di mana Anda menggunakan impor/ekspor anggota selektif dengan fungsi virtual, fungsi harus berada di antarmuka yang dapat diekspor atau ditentukan sebaris (terlihat oleh klien).
Jika Anda menentukan anggota sebagai
dllexport
tetapi tidak menyertakannya dalam definisi kelas, kesalahan kompilator dihasilkan. Anda harus menentukan anggota di header kelas.Meskipun definisi anggota kelas sebagai
dllimport
ataudllexport
diizinkan, Anda tidak dapat mengambil alih antarmuka yang ditentukan dalam definisi kelas.Jika Anda menentukan fungsi anggota di tempat selain isi definisi kelas tempat Anda mendeklarasikannya, peringatan dihasilkan jika fungsi didefinisikan sebagai
dllexport
ataudllimport
(jika definisi ini berbeda dari yang ditentukan dalam deklarasi kelas).
END Khusus Microsoft
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk