Bagikan melalui


arahan #import (C++)

C++ Spesifik

Digunakan untuk menggabungkan informasi dari pustaka jenis. Konten pustaka jenis dikonversi menjadi kelas C++, sebagian besar menggambarkan antarmuka COM.

Sintaks

#import "nama file" [atribut]
<#import nama> file [atribut]

Parameter

filename
Menentukan pustaka tipe yang akan diimpor. Nama file dapat berupa salah satu jenis berikut:

  • Nama file yang berisi pustaka jenis, seperti file .olb, .tlb, atau .dll. Kata kunci, file:, dapat mendahului setiap nama file.

  • Progid kontrol di pustaka jenis. Kata kunci, progid:, dapat mendahului setiap progid. Contohnya:

    #import "progid:my.prog.id.1.5"
    

    Untuk informasi selengkapnya tentang progid, lihat Menentukan ID Pelokalan dan Nomor Versi.

    Ketika Anda menggunakan pengkompilasi silang 32-bit pada sistem operasi 64-bit, pengkompilasi hanya dapat membaca sarang registri 32-bit. Anda mungkin ingin menggunakan kompilator 64-bit asli untuk membangun dan mendaftarkan pustaka jenis 64-bit.

  • ID pustaka dari pustaka jenis. Kata kunci, libid:, dapat mendahului setiap ID pustaka. Contohnya:

    #import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
    

    Jika Anda tidak menentukan atau , aturan yang diterapkan progid: juga diterapkan ke libid:.lcidversion

  • File executable (.exe).

  • File pustaka (.dll) yang berisi sumber daya pustaka jenis (seperti .ocx).

  • Dokumen majemuk yang menyimpan pustaka jenis.

  • Format file lain yang dapat dipahami oleh API LoadTypeLib .

Atribut
Satu atau beberapa atribut #import. Pisahkan atribut dengan spasi atau koma. Contohnya:

#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only

-atau-

#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only

Keterangan

Pesanan pencarian untuk nama file

nama file secara opsional didahului oleh spesifikasi direktori. Nama file harus menamai file yang ada. Perbedaan antara dua bentuk sintaksis adalah urutan di mana praprosesor mencari file pustaka jenis ketika jalur ditentukan secara tidak lengkap.

Formulir sintaks Tindakan
Formulir yang dikutip Menginstruksikan preprocessor untuk mencari jenis file pustaka terlebih dahulu di direktori file yang berisi pernyataan #import , lalu di direktori file apa pun termasuk (#include) file tersebut. Prapemroses kemudian mencari di sepanjang jalur yang ditunjukkan di bawah ini.
Formulir Angle-bracket Menginstruksikan prapemrosesan untuk mencari file pustaka jenis di sepanjang jalur berikut:

1. Daftar PATH jalur variabel lingkungan
2. Daftar LIB jalur variabel lingkungan
3. Jalur yang ditentukan oleh opsi pengkompilasi /I , kecuali kompiler mencari pustaka jenis yang dirujuk dari pustaka jenis lain dengan atribut no_registry .

Tentukan ID pelokalan dan nomor versi

Saat Menentukan progid, Anda juga dapat menentukan ID pelokalan dan nomor versi progid. Contohnya:

#import "progid:my.prog.id" lcid("0") version("4.0)

Jika Anda tidak menentukan ID pelokalan, progid dipilih sesuai dengan aturan berikut:

  • Jika hanya ada satu ID pelokalan, ID tersebut akan digunakan.

  • Jika ada lebih dari satu ID pelokalan, yang pertama dengan nomor versi 0, 9, atau 409 digunakan.

  • Jika ada lebih dari satu ID pelokalan dan tidak ada yang 0, 9, atau 409, yang terakhir digunakan.

  • Jika Anda tidak menentukan nomor versi, versi terbaru akan digunakan.

File header yang dibuat oleh impor

#import membuat dua file header yang membangun ulang konten pustaka jenis dalam kode sumber C++. File header utama mirip dengan yang dihasilkan oleh pengkompilasi Microsoft Interface Definition Language (MIDL), tetapi dengan kode dan data tambahan yang dihasilkan kompilator. File header utama memiliki nama dasar yang sama dengan pustaka jenis, ditambah . Ekstensi TLH. File header sekunder memiliki nama dasar yang sama dengan pustaka jenis, dengan . Ekstensi TLI. Ini berisi implementasi untuk fungsi anggota yang dihasilkan kompilator, dan disertakan (#include) dalam file header utama.

Jika mengimpor properti dispinterface yang menggunakan byref parameter, #import tidak menghasilkan pernyataan __declspec(properti) untuk fungsi tersebut.

Kedua file header ditempatkan dalam direktori output yang ditentukan oleh opsi /Fo (file objek nama). Mereka kemudian dibaca dan dikompilasi oleh pengkompilasi seolah-olah file header utama dinamai oleh #include direktif.

Pengoptimalan kompilator berikut dilengkapi dengan arahan #import :

  • File header, saat dibuat, diberi tanda waktu yang sama dengan pustaka jenis.

  • Ketika #import diproses, pengkompilasi terlebih dahulu memeriksa apakah header ada dan sudah diperbarui. Jika ya, maka tidak perlu dibuat ulang.

Arahan #import juga berpartisipasi dalam pembangunan ulang minimal dan dapat ditempatkan dalam file header yang telah dikompilasi sebelumnya. Untuk informasi selengkapnya, lihat Membuat file header yang telah dikommpilasikan sebelumnya.

File header pustaka jenis utama

File header pustaka jenis utama terdiri dari tujuh bagian:

  • Judul boilerplate: Terdiri dari komentar, #include pernyataan untuk COMDEF. H (yang mendefinisikan beberapa makro standar yang digunakan di header), dan informasi penyiapan lain-lain.

  • Meneruskan referensi dan typedefs: Terdiri dari deklarasi struktur seperti struct IMyInterface dan typedefs.

  • Deklarasi penunjuk cerdas: Kelas _com_ptr_t templat adalah penunjuk cerdas. Ini merangkum pointer antarmuka, dan menghilangkan kebutuhan untuk memanggil AddRef, Release, dan QueryInterface fungsi. Ini juga menyembunyikan CoCreateInstance panggilan saat membuat objek COM baru. Bagian ini menggunakan pernyataan _COM_SMARTPTR_TYPEDEF makro untuk membuat typedefs antarmuka COM sebagai spesialisasi templat dari kelas templat _com_ptr_t . Misalnya, untuk antarmuka IMyInterface, . File TLH akan berisi:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    yang akan diperluas pengkompilasi ke:

    typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
    

    Jenis IMyInterfacePtr kemudian dapat digunakan sebagai pengganti penunjuk IMyInterface*antarmuka mentah . Akibatnya, tidak perlu memanggil berbagai IUnknown fungsi anggota

  • Deklarasi Typeinfo: Terutama terdiri dari definisi kelas dan item lain yang mengekspos item typeinfo individual yang dikembalikan oleh ITypeLib:GetTypeInfo. Di bagian ini, setiap typeinfo dari pustaka jenis tercermin dalam header dalam formulir tergantung pada TYPEKIND informasi.

  • Definisi GUID gaya lama opsional: Berisi inisialisasi konstanta GUID bernama. Nama-nama ini memiliki formulir CLSID_CoClass dan IID_Interface, mirip dengan yang dihasilkan oleh pengkompilasi MIDL.

  • #include pernyataan untuk header pustaka jenis sekunder.

  • Footer boilerplate: Saat ini termasuk #pragma pack(pop).

Semua bagian, kecuali bagian boilerplate judul dan footer boilerplate, diapit dalam namespace dengan namanya yang ditentukan oleh library pernyataan dalam file IDL asli. Anda dapat menggunakan nama dari header pustaka jenis dengan kualifikasi eksplisit menggunakan nama namespace. Atau, Anda dapat menyertakan pernyataan berikut:

using namespace MyLib;

segera setelah pernyataan #import dalam kode sumber.

Namespace dapat ditekan dengan menggunakan atribut no_namespace) dari arahan #import . Namun, menekan namespace dapat menyebabkan tabrakan nama. Namespace juga dapat diganti namanya dengan atribut rename_namespace .

Pengkompilasi menyediakan jalur lengkap ke dependensi pustaka jenis apa pun yang diperlukan oleh pustaka jenis yang saat ini sedang diproses. Jalur ditulis, dalam bentuk komentar, ke header pustaka jenis (. TLH) yang dihasilkan pengkompilasi untuk setiap pustaka jenis yang diproses.

Jika pustaka jenis menyertakan referensi ke jenis yang ditentukan dalam pustaka jenis lain, maka . File TLH akan menyertakan komentar dari pengurutan berikut:

//
// Cross-referenced type libraries:
//
//  #import "c:\path\typelib0.tlb"
//

Nama file aktual dalam komentar #import adalah jalur lengkap dari pustaka jenis yang direferensikan silang, seperti yang disimpan dalam registri. Jika Anda mengalami kesalahan yang disebabkan oleh definisi jenis yang hilang, periksa komentar di kepala . TLH untuk melihat pustaka jenis dependen mana yang mungkin perlu diimpor terlebih dahulu. Kemungkinan kesalahan adalah kesalahan sintaksis (misalnya, C2143, C2146, C2321), C2501 (hilang decl-specifier), atau C2433 ('inline' tidak diizinkan pada deklarasi data) saat mengkompilasi . File TLI.

Untuk mengatasi kesalahan dependensi, tentukan komentar dependensi mana yang tidak disediakan oleh header sistem, lalu berikan arahan #import pada beberapa titik sebelum arahan #import pustaka jenis dependen.

atribut #import

#import dapat secara opsional menyertakan satu atau beberapa atribut. Atribut ini memberi tahu pengkompilasi untuk memodifikasi konten header type-library. Simbol garis miring terbalik (\) dapat digunakan untuk menyertakan baris tambahan dalam satu pernyataan #import . Contohnya:

#import "test.lib" no_namespace \
   rename("OldName", "NewName")

Untuk informasi selengkapnya, lihat atribut #import.

END C++ Spesifik

Baca juga

Arahan pra-prosesor
Dukungan COM compiler