什么是组件平台,计算机产业一直在探索类似于工业化大生产流水线一样的生产方式。
及软件可以以更小的组件形式组装在一起。本文试图探索一下一直到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.组件平台的路还在继续。