Microsoft 介面定義語言（；縮寫：MIDL）是微軟的基於文字的介面描述語言。擴充套件自 DCERPC IDL 用於微軟的元件物件模型（Component Object Model）。 它的編譯器是 MIDLexe（隨 Microsoft Windows SDK 發行）。MIDL 用於遠端過程呼叫（RPC）的介面、DCOM 介面、OLE 自動化的型別庫等的描述 簡介 每個 IDL 檔案包含一個或多個 interface 定義。每個 interface 定義由 interface 頭部與 interface 體組成。interface 頭部給出了介面的整體資訊；如果含關鍵字 object，表示這是一個 COM 介面，否則表示這是一個 DCE RPC 介面。interface 體給出了所有需要暴露的資訊。 IDL 檔案中一個介面的結構資訊： header Interface attributes go here interface INTERFACENAME body The interface body goes here library TyeLibraryFileName Type library Information IDL 檔案介面示例： object uuid C0E20128DB194DB3BCA124595E5E24A8 dual nonextensible helpstring IConfig Interface pointer_default unique interface ILogManager IDispatch id 1 helpstring Initializes ILogManager HRESULT Initialize in IConfig Config id 2 helpstring Logs MemberClaims HRESULT LogMemberClaims in IMember Member id 3 helpstring Logs ILogData to specified destination HRESULT Log in ILogData LogData library MyTypeLibraryFileLib uuid B3F6C9C426AE451B978875F6C648DBF4 helpstring LogManager Class coclass LogManager default interface ILogManager 型別庫用於向編譯器提供關於類、介面、列舉等的 COM 物件或 COM 介面的資訊。型別庫是二進位制檔案。MIDL 編譯器處理 IDL 檔案並建立型別庫檔案、標頭檔案、proxy 檔案。例如： midl myfilectlidltlb myfilectltlbh 其中 h 產生 C 標頭檔案。 MIDL 編譯器編譯 nameidl 預設產生的檔案，對於 RPC 介面為 Client stub name_cc Server stub name_sc Header file nameh 對於 COM 介面預設產生的檔案 Interface proxystub file name_pc 給客戶 伺服器的 surrogate entry points Interface header file nameh 包含 IDL 檔案中定義的介面的型別定義與函式宣告，以及 stub 呼叫的子例程的前向宣告。 Interface UUID file name_ic 介面 ID 檔案，定義 IDL 檔案中的每個介面的 GUID 型別庫檔案 nametlb Dlldatac 建立 proxystub DLL 所需要的資料 如果介面屬性列表中有 local 屬性，編譯進產生介面的標頭檔案，Nameh 歷史 MIDL 30 版支援按照類似於 C的格式寫 idl 檔案。這要求使用 Microsoft Windows SDK 100171340 版或以上，其所包含的 midlexe 為 8010622 版或以上，編譯時使用 winrt 選項。介面中的非 local 的成員函式返回型別只能是 HRESULT 或 SCODE，早於 30 的版本還允許返回型別為 void，但這種 30 版本中將編譯報錯。 語言內容 介面可以前向宣告，以便被引用。 型別定義 typedef、construct 宣告、import 指令（類似於 C 語言預處理器 include 指令），可以出現在 interface 體的外部。IDL 檔案的這些定義都會出現在產生的標頭檔案中；所有介面的所有過程都會被建立 stub 例程。 MIDL 資料型別 陣列定義遵從 C 語言的標準，陣列下界必須為 0。 一對方括號內如果只有一個數，表示陣列下界為 0 上界為 N1；如果方括號內為 號，表示下界為 0 上界在執行時確定；lowerupper 明確給出上下限。多維陣列只有最左維可以不在編譯時指定。 封裝的聯合型別（encapsulated union）是指型別的透過 switch 定義的判別資料成員（discriminant）也被封裝在型別中。如下例： typedef union _S1_TYPE switch long l1 U1_TYPE case 1024 float f1 case 2048 double d2 S1_TYPE 在產生的標頭檔案中： typedef struct _S1_TYPE long l1 union float f1 double d2 U1_TYPE S1_TYPE 型別庫 型別庫是二進位制檔案 tlb 包含了一個 ActiveX 應用程式暴露的型別與物件的資訊。可包括： 資料型別資訊，如：aliases enumerations structures unions 物件描述，每一個這樣的描述稱作 typeinfo。如：module interface IDispatch interface dispinterface component object class coclass 可以理解介面是抽象類，coclass 是介面的物理實現類。 引用別的型別庫的型別描述。 型別庫可以是 midl 編譯產生的單獨的二進位制檔案 tlb，表示 type library。也可以用資源編譯器 rcexe 把tlb 檔案增加到 DLL 或 exe 檔案中。帶有 1 個或多個型別庫資源的 DLL 典型具有副檔名olb object library tlb 檔案在資原始檔 rc 中必須寫成如下形式，帶有整數辨識符、型別為 TypeLib： 1 typelib mylib1tlb 2 typelib mylib2tlb 把 tlb 登記在 Windows 登錄檔，可以用NET FRAMEWOK 帶有的 regtlibv12exe，通常在這樣的目錄下： CWINDOWSMicrosoftNETFrameworkv4030319regtlibv12exe 各種型別庫工具（如編譯器、object browser 等）透過 ITypeLib 這樣的介面訪問二進位制型別庫資訊。 型別庫描述語言是 ODL，最頂層語法結構是 library 語句。 MIDL 的資料型別中，boolean 基礎型別等價於 VT_UI1；BOOL 資料型別被定義為 long；如果希望使用 VT_BOOL，那應該用 VARIANT_BOOL 資料型別。 下述程式碼裝入並在 Windows 登錄檔中註冊一個型別庫： ITypeLib pTypeLib HRESULT hr hr LoadTypeLibEx exampletlb REGKIND_REGISTER pTypeLib if SUCCEEDED hr pTypeLibRelease else exit 0 Handle errors here 參見 參考文獻 外部連結 Microsoft Interface Definition Language Win32 apps Microsoft Docs Microsoft Interface Definition Language 30 reference Windows UWP applications Microsoft Docs 參考文獻 Category 微軟開發工具 Category 微軟 API Category 基於元件的軟體工程