MIDL ile MkTypLib Arasındaki Farklar
Not
Mktyplib.exe aracı kullanımdan kaldırıldı. Bunun yerine MIDL derleyicisini kullanın.
MIDL derleyicisinin MkTypLib'den farklı olduğu birkaç önemli alan vardır. MidL, MkTypLib'den daha çok C söz dizimine yönlendirildiğinden bu farklılıkların çoğu ortaya çıkar.
Genel olarak, IDL dosyalarınızda MIDL söz dizimini kullanmak isteyeceksiniz. Ancak, mevcut bir ODL dosyasını derlemeniz veya başka bir şekilde MkTypLib ile uyumluluğu sürdürmeniz gerekiyorsa, MIDL'yi Mkktyplib.exe, sürüm 2.03 gibi davranmaya zorlamak için MIDL derleyicisi/mktyplib203 seçeneğini kullanın. (Bu, MkTypLib aracının son sürümüdür.) Özel olarak, /mktyplib203 seçeneği şu farklılıkları çözer:
Karmaşık veri türleri için typedef söz dizimi
MkTypLib'de, aşağıdaki tanımların her ikisi de tür kitaplığında "this_struct" için bir TKIND_RECORD oluşturur. "struct_tag" etiketi isteğe bağlıdır ve kullanılırsa tür kitaplığında gösterilmez.
typedef struct struct_tag { ... } this_struct; typedef struct { ... } that_struct;
İsteğe bağlı bir etiket eksikse, MIDL bunu oluşturur ve kullanıcı tarafından sağlanan tanıma etkili bir şekilde bir etiket ekler. İlk tanımın etiketi olduğundan, MIDL "this_struct" için bir TKIND_RECORD ve "this_struct" için bir TKIND_ALIAS oluşturur ("this_struct" "struct_tag" için diğer ad olarak tanımlanır). İkinci tanımda etiket eksik olduğundan, MIDL, kullanıcı için anlamlı olmayan ve "that_struct" için bir TKIND_ALIAS olan, MIDL'nin içindeki bir mangled adı için bir TKIND_RECORD oluşturur.
Bunun, yalnızca kullanıcı arabiriminde bir kaydın adını gösteren tür kitaplığı tarayıcıları için olası etkileri vardır. bir TKIND_RECORD gerçek bir ada sahip olmasını bekliyorsanız, kullanıcı arabiriminde tanınmayan adlar görünebilir. Bu davranış, sırasıyla MIDL derleyicisi TKIND_UNIONs ve TKIND_ENUMs oluştururken birleşim ve numaralandırma tanımları için de geçerlidir.
MIDL ayrıca C stili yapısına, birleşimve numaralandırma tanımlarına da olanak tanır. Örneğin, MIDL'de aşağıdaki tanım yasaldır:
struct my_struct { ... }; typedef struct my_struct your_struct;
Boole veri türleri
MkTypLib'de Boole temel türü ve MkTypLib veri türü BOOL, VARIANT_BOOL ile eşlenen ve kısaolarak tanımlanan VT_BOOL eşittir. MIDL'de Boole temel türü, VT_UI1 eşdeğerdir ve imzasız karakterolarak tanımlanır ve BOOL veri türü uzunolarak tanımlanır. Bu, MkTypLib ile uyumluluğu sürdürmeye çalışırken aynı dosyada IDL söz dizimi ve ODL söz dizimini karıştırdığınızda güçlüklere yol açar. Veri türleri farklı boyutlarda olduğundan, sıralama kodu tür bilgilerinde açıklananlarla eşleşmez. Tür kitaplığınızda bir VT_BOOL istiyorsanız, VARIANT_BOOL veri türünü kullanmanız gerekir.
Üst bilgi dosyalarındaki GUID tanımları
MkTypLib'de GUID'ler üst bilgi dosyasında, GUID ön tanımı veya örneklenmiş GUID oluşturmak için koşullu olarak derlenebilen bir makroyla tanımlanır. MIDL normalde GUID ön tanımlarını oluşturulan üst bilgi dosyalarına ve GUID örneklemelerine yalnızca /iid anahtarı tarafından oluşturulan dosyaya yerleştirir.
Aşağıdaki davranış farklılıkları /mktyplib203 anahtarı kullanılarak çözülemez:
Büyük/küçük harf duyarlılığı
MIDL büyük/küçük harfe duyarlıdır, OLE Otomasyonu değildir.
Sabit listesi bildirimindeki simgelerin kapsamı
MkTypLib'de bir sabit listesi içindeki simgelerin kapsamı yereldir. MIDL'de, bir numaralandırmadaki simgelerin kapsamı C'de olduğu gibi geneldir. Örneğin, aşağıdaki kod MkTypLib'de derlenir, ancak MIDL'de yinelenen ad hatası oluşturur:
typedef struct { ... } a; enum {a=1, b=2, c=3};
Ortak özniteliğin kapsamı
genel özniteliğini bir arabirim bloğuna uygularsanız, MkTypLib bu arabirim bloğunun içindeki her tür tanımına genel olarak davranır. MIDL, ortak olmasını istediğiniz tür tanımlarına açıkça genel özniteliğini uygulamanızı gerektirir.
importlib arama sırası
Birden fazla tür kitaplığını içeri aktarırsanız ve bu kitaplıklar yinelenen başvurular içeriyorsa, MkTypLib bulduğu ilk başvuruyu kullanarak bu sorunu çözer. MIDL bulduğu son başvuruyu kullanır. Örneğin, aşağıdaki ODL söz dizimi göz önünde bulundurulduğunda, MkTypLib ile derlediyseniz C kitaplığı A kitaplığından MOO tür tanımı ve MIDL ile derlediyseniz B kitaplığından MOO tür tanımı kullanır:
[...]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 }
Bunun için uygun geçici çözüm, bu tür her başvuruyu doğru içeri aktarma kitaplığı adıyla nitelemektir, örneğin:
typedef struct tagBAA {A.MOO y;}BAA
VOID veri türü tanınmadı
MIDL, C dili void veri türünü tanır ve OLE Otomasyonu VOID veri türünü tanımaz. VOID kullanan bir ODL dosyanız varsa, bu tanımı dosyanın en üstüne yerleştirin:
#define VOID void '''
Üstel gösterim
MIDL, üstel gösterimle ifade edilen değerlerin tırnak içinde yer almalarını gerektirir. Örneğin, "-2.5E+3"
LCID değerleri ve sabitleri
Normalde MIDL dosyaları ayrıştırırken LCID'yi dikkate almaz. Bir değer için bu davranışı zorlamak için veya sabit tanımlarken yerel ayara özgü gösterimi kullanmanız gerekiyorsa, değeri veya sabiti tırnak içine alın.
Daha fazla bilgi için bkz. /mktyplib203, /iidve OLE Veri Türlerini Hazırlama.