C++組件擴展:COM的新面孔

fmms 14年前發布 | 16K 次閱讀 C/C++

目前 COM 編程仍然活躍在 Windows 平臺上,但 C++ 的新變種使得它更易于使用。它叫做 C++ 組件擴展(Component Extensions),新的 Windows 運行時 WinRT就是用這種新語言創建的。

盡管 C++ 組件擴展還是基于 COM,但它與 .NET 編程非常類似。也就是說,你可以直接對類和對象進行操作,而不需要通過 COM 接口。

C++ 組件首先要創建一個公共類,并用“public ref class XXX sealed”的形式來定義,其中“XXX”是類名。這樣聲明的類叫做“可激活的類(activatable class)”,可以供 .NET 和基于 JavaScript 的應用程序使用。“ref”關鍵字表示類是一種“與 Windows 運行時兼容的類型”。“sealed”關鍵字防止它被其它類繼承,如果一個類想要被 JavaScript 使用,這是必要的條件。盡管文檔沒有明確說明,但似乎如果不從 JavaScript 使用,就不需要使用“sealed”關鍵字來聲明類。例如,Button 類就繼承了 ButtonBase。除了支持類之外,C++組件擴展還支持結構體。然而 Windows 運行時結構體僅限于裸數據成員(naked data members)使用。

類中可能會包含構造函數、方法、屬性和事件。在類本身之外,你可能發現事件會使用“delegate”關鍵字。盡管這不是 C++ 或者 CLI,但出乎意料的是,這個語法使用“^”符號來結束。

在 C++ 組件擴展中,內存是基于它所使用的語言的語義來區別處理的。如果 C++ 應用程序使用了程序庫,那么對象就會以引用的形式計算。當然,.NET 消費程序會使用 mark-and-sweep 的垃圾回收機制。

公有方法是通過 ABI(抽象二進制接口 Abstract Binary Interface)暴露出來的。這樣的方法必須使用 Windows 運行時類型作為參數。C++的內建類型——像 int 和 double——會自動轉換,而其他類型的轉換都必須進行顯式地聲明。對于公有方法它還使用了 Platform::String,在內部微軟建議使用標準的 C++ 字符串類型。

通過 ABI 無法支持自定義的異常類型。開發者必須拋出一種內建的異常類型。如果還需要額外的信息,我們可以拋出一般的 COMException,它會使用 HRESULT 作為參數。

盡管 JavaScript 支持的類都要帶有關鍵字“sealed”,但它至少還可以實現接口。
    
       來自: InfoQ

查看英文原文:C++ Component Extensions: The New Face of COM

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!