Bagikan melalui


Perbedaan Antara MIDL dan MkTypLib

Catatan

Alat Mktyplib.exe usang. Gunakan pengkompilasi MIDL sebagai gantinya.

 

Ada beberapa area utama di mana pengkompilasi MIDL berbeda dari MkTypLib. Sebagian besar perbedaan ini muncul karena MIDL lebih berorientasi pada sintaks C daripada MkTypLib.

Secara umum, Anda akan ingin menggunakan sintaks MIDL dalam file IDL Anda. Namun, jika Anda perlu mengkompilasi file ODL yang ada, atau mempertahankan kompatibilitas dengan MkTypLib, gunakan opsi kompilator MIDL /mktyplib203 untuk memaksa MIDL berperilaku seperti Mkktyplib.exe, versi 2.03. (Ini adalah rilis terakhir dari alat MkTypLib.) Secara khusus, opsi /mktyplib203 menyelesaikan perbedaan ini:

  • sintaks typedef untuk jenis data kompleks

    Di MkTypLib, kedua definisi berikut menghasilkan TKIND_RECORD untuk "this_struct" di pustaka jenis. Tag "struct_tag" bersifat opsional dan, jika digunakan, tidak akan muncul di pustaka jenis.

    typedef struct struct_tag { ... } this_struct;
    typedef struct { ... } that_struct;
    

    Jika tag opsional hilang, MIDL akan membuatnya, secara efektif menambahkan tag ke definisi yang disediakan oleh pengguna. Karena definisi pertama memiliki tag, MIDL akan menghasilkan TKIND_RECORD untuk "this_struct" dan TKIND_ALIAS untuk "this_struct" (mendefinisikan "this_struct" sebagai alias untuk "struct_tag"). Karena tag hilang dalam definisi kedua, MIDL akan menghasilkan TKIND_RECORD untuk nama terkelola, internal hingga MIDL, yang tidak berarti bagi pengguna dan TKIND_ALIAS untuk "that_struct".

    Ini memiliki implikasi potensial untuk browser pustaka jenis yang hanya menampilkan nama rekaman di antarmuka pengguna mereka. Jika Anda mengharapkan TKIND_RECORD memiliki nama asli, nama yang tidak dapat dikenali dapat muncul di antarmuka pengguna. Perilaku ini juga berlaku untuk definisi gabungan dan enum , dengan kompilator MIDL yang menghasilkan TKIND_UNIONs dan TKIND_ENUMs.

    MIDL juga memungkinkan definisi struct, union, dan enum gaya C. Misalnya, definisi berikut adalah legal di MIDL:

    struct my_struct { ... };
    typedef struct my_struct your_struct;
    
  • Jenis data Boolean

    Dalam MkTypLib, jenis dasar Boolean dan jenis data MkTypLib BOOL sama dengan VT_BOOL, yang memetakan ke VARIANT_BOOL, dan yang didefinisikan sebagai singkatnya. Di MIDL, jenis dasar Boolean setara dengan VT_UI1, yang didefinisikan sebagai karakter yang tidak ditandatangani, dan jenis data BOOL didefinisikan sebagai panjang. Ini menyebabkan kesulitan jika Anda mencampur sintaks IDL dan sintaks ODL dalam file yang sama sambil tetap mencoba mempertahankan kompatibilitas dengan MkTypLib. Karena jenis data berukuran berbeda, kode marshaling tidak akan cocok dengan apa yang dijelaskan dalam informasi jenis. Jika Anda menginginkan VT_BOOL di pustaka jenis, Anda harus menggunakan jenis data VARIANT_BOOL.

  • Definisi GUID dalam file header

    Dalam MkTypLib, GUID didefinisikan dalam file header dengan makro yang dapat dikompilasi secara kondisional untuk menghasilkan pradefinisi GUID atau GUID yang dibuat. MIDL biasanya menempatkan pradefinisi GUID dalam file header yang dihasilkan dan instansiasi GUID hanya dalam file yang dihasilkan oleh sakelar /iid .

Perbedaan perilaku berikut tidak dapat diselesaikan dengan menggunakan sakelar /mktyplib203 :

  • Sensitivitas huruf besar/besar

    MIDL peka huruf besar/kecil, OLE Automation tidak.

  • Cakupan simbol dalam deklarasi enum

    Dalam MkTypLib cakupan simbol dalam enum bersifat lokal. Di MIDL, cakupan simbol dalam enum bersifat global, seperti dalam C. Misalnya, kode berikut akan dikompilasi di MkTypLib, tetapi akan menghasilkan kesalahan nama duplikat di MIDL:

    typedef struct { ... } a;
    enum {a=1, b=2, c=3};
    
  • Cakupan atribut publik

    Jika Anda menerapkan atribut publik ke blok antarmuka, MkTypLib memperlakukan setiap typedef di dalam blok antarmuka tersebut sebagai publik. MIDL mengharuskan Anda secara eksplisit menerapkan atribut publik ke typedef yang Anda inginkan untuk publik.

  • Urutan pencarian importlib

    Jika Anda mengimpor lebih dari satu pustaka jenis, dan jika pustaka ini berisi referensi duplikat, MkTypLib menyelesaikan ini dengan menggunakan referensi pertama yang ditemukannya. MIDL akan menggunakan referensi terakhir yang ditemukannya. Misalnya, mengingat sintaks ODL berikut, pustaka C akan menggunakan typedef MOO dari pustaka A jika Anda mengkompilasi dengan MkTypLib, dan typedef MOO dari pustaka B jika Anda mengkompilasi dengan MIDL:

    [...]library A
    {
        typedef struct tagMOO
        {...}MOO
    }
    
    [...]library B
    {
        typedef struct tagMOO
        {...} MOO
    }
    
    [...]library C
    {
        importlib (A.TLB)
        importlib (B.TLB)
        typedef struct tagBAA
        {MOO y;}BAA
    }
    

    Solusi yang sesuai untuk ini adalah memenuhi syarat setiap referensi tersebut dengan nama pustaka impor yang benar, seperti ini:

    typedef struct tagBAA
        {A.MOO y;}BAA
    
  • Tipe data VOID tidak dikenali

    MIDL mengenali jenis data kekosongan bahasa C dan tidak mengenali jenis data OLE Automation VOID. Jika Anda memiliki file ODL yang menggunakan VOID, letakkan definisi ini di bagian atas file:

#define void '''

  • Notasi eksponensial

    MIDL mengharuskan nilai yang dinyatakan dalam notasi eksponensial terkandung dalam tanda kutip. Misalnya, "-2.5E+3"

  • Nilai dan konstanta LCID

    Biasanya MIDL tidak mempertimbangkan LCID saat mengurai file. Untuk memaksa perilaku ini untuk nilai, atau jika Anda perlu menggunakan notasi khusus lokal saat menentukan konstanta, sertakan nilai atau konstanta dalam tanda kutip.

Untuk informasi selengkapnya, lihat /mktyplib203, /iid, dan Marshaling OLE Data Type.