posts - 3, comments - 0, trackbacks - 0, articles - 1

引言:

       在上一篇文章中,我们引入了一个组件化编程的架构,其实它是一个仿COM架构。尽管相对于COM而言它已经相当的简单了,但总的来说它仍是比较复杂。本文引入了另一种组件化编程的实现架构,相对于仿COM篇而言,它的结构更加清晰,实现更加简单。

 

组件化编程再分析:

       其实引入组件化编程的关键目的是为了将程序模块化,使各个模块之间可以单独开发,单独测试。当然,随之而来的DLL版本问题也必须要解决,防止出现不兼容的组件版本破坏程序的稳定性。只需要达到几个目的就行了,我们没必要把事情做得太过于复杂。

 

实现:

       将程序模块化,使之可以单独开发、测试而不影响其它的模块,仍然需要将每个模块分解到DLL去实现。通常因为面向对象、函数同名、函数地址偏移,使用方便等等原因,我们不希望直接使用DLL导出API,而希望能使用接口,以面向对象的方式编程。为了解决版本问题,我们给每个接口的实现版本加个标示。既我们可以要求DLL给出1.0版的接口实现。2.0版的接口实现等。还有,我们还要告诉DLL我们想获得哪个接口。于是统一起来,给每个接口加个唯一ID,因为通常我们的程序不会在全球发行,所以也没必要使用GUID,使用字符串标示就行了。

每个接口的实现都有自己的创建函数,所以我们在每个模块中建立一张表,维护接口标示与接口创建函数的关系

接口标示

全局创建函数

“VUIManager001”

__g_CreateVUIManager001interfaceNam_reg()

“VUIManager002”

__g_CreateVUIManager002interfaceNam_reg()

“VSkin001”

__g_CreateVSkin001interfaceNam_reg()

“VSkin002”

__g_CreateVSkin002interfaceNam_reg()

DLL中导出接口创建API

 DLL_EXPORT void*CreateInterface(const char *pInterfaceName, int *pReturnCode);

简化接口的创建过程.bmp
小结:

       本实现仅是组件化编程的一个简化实现,它并不能取代《仿COM篇》,它所实现的功能也不如《仿COM篇》那么强大,例如它需要实现知道接口所在的DLL,不能实现自扩展等。但对于一般的程序而言,它更简单使用。

还可以使用宏定义 把接口标示和接口创建函数与创建过程关联起来,将接口创建API也包装起来,开发中将更加方便。只需一个宏就可以搞定这些操作。