什麼是組件平台,電腦產業一直在探索類似於工業化大生產流水線一樣的生產方式。及軟體可以以更小的組件形式組裝在一起。本文試圖探索一下一直到Win8時的路線。
C語言是一門偉大的語言,在產生了UNIX以後,C&UNIX是天生的一對。當時或者直到今天
的一種組件萌芽的形式就是,以C的庫來封裝組件。一個一個的函數是隨後的螺絲釘。
C是偉大的,但C也是有缺陷的。它唯一一個解決不了的問題,就是複雜性。今天的軟體日益複雜,C老了,需要新鮮血液。物件導向是公認的複雜性的解決辦法。C++是號稱C的物件導向解決方案,但是C++解決了組件平台了嗎?不用回答,現實就可以回答。
業界曾經出現過以COM封裝的組件平台,也出現過以Java,.Net虛擬機器形式封裝的組件庫。對於作業系統,也出現過很多,比如微軟的COM,蘋果的以Objective-C為基礎組件平台(Cocoa),微軟有一段時間以為.Net可以成為組件平台,但當作業系統的效能成為一個問題,蘋果給它帶來更多壓力的時候,它又重啟組件平台探索,這就是Win8裡的WinRT以及C++/CX.
C++/CX全稱是C++ Componenet Extension,也就是C++ + Component Extension。這個世界,
C是不可丟的,需要往上面不停的加東西。呵呵!
隨著深入的學習,發現Metro的組件類似於COM組件,也還是要在註冊表中註冊,我不玩了。
附張圖
最後的補充
C++/CX的編譯,連結不同於C++的編譯與連結。編譯不採用標頭檔,而是類似於COM類型庫一樣,尋找winmd元資訊。連結也不同於C++,不採用符號連結。
C++/CX不能產生靜態庫,當然,C++的部分可以。產生的組件庫依賴註冊表,和以前的COM一樣。但是,不同於COM,所有介面繼承於IInspectable
typedef struct IInspectableVtbl
{ BEGIN_INTERFACE HRESULT ( STDMETHODCALLTYPE *QueryInterface )( __RPC__in IInspectable * This, /* [in] */ __RPC__in REFIID riid, /* [annotation][iid_is][out] */ _COM_Outptr_ void **ppvObject); ULONG ( STDMETHODCALLTYPE *AddRef )( __RPC__in IInspectable * This); ULONG ( STDMETHODCALLTYPE *Release )( __RPC__in IInspectable * This); HRESULT ( STDMETHODCALLTYPE *GetIids )( __RPC__in IInspectable * This, /* [out] */ __RPC__out ULONG *iidCount, /* [size_is][size_is][out] */ __RPC__deref_out_ecount_full_opt(*iidCount) IID **iids); HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )( __RPC__in IInspectable * This, /* [out] */ __RPC__deref_out_opt HSTRING *className); HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )( __RPC__in IInspectable * This, /* [out] */ __RPC__out TrustLevel *trustLevel); END_INTERFACE } IInspectableVtbl;
看似這裡許可權管理更嚴格,微軟似乎不想把C++/CX引出Metro外。亂,就一個字。還不如用Java或是.Net了。.Net本身是微軟的,而Google也因為Android用Java和Oracle打官司。蘋果不必說,其它平台似乎一律都是JavaScript.組件平台的路還在繼續。