background image

CDviece *pMineDviece = new CDmc1000Card; 
改为

OMS 控制卡则一样: 

CDviece *pMineDviece = new COMS; 
而其它代码调用

InitBoard 函数可以不去改动,照常使用: 

if( pMineDviece->InitBoard() ) 

…(Do s.th) 

使用此方法,需要根据当前设备配置情况,完整的写好

CDviece 的所有函数,同样,从

CDviece 派生的控制卡类,也需要将父类虚拟函数全部改写完毕,对函数返回值,参数都
需要进行规范,同时,修改完成之后,将整个软件工程全部编译一次。

 

利用虚拟函数方法,会带来虚拟函数表的成本开销,随着

CDivece 需要的函数增加,其成

本会相应的增加,事实上,

MFC 的消息机制就是以代码的方法实现了虚拟函数的机制,只

不过虚拟函数的处理是通过

C++编译器来完成的。 

并且,

CDviece 的需求发生变化时,其派生类的函数相应的也要发生变化,这一点是程序

员需要注意的。

 

二、利用

DLL 动态库实现 

COM 组件编程过来的人,很容易想到 DLL 的实现方案。看重这一点是的只要主程序框架

写得正确,改变

DLL 即可实现主程序不编译,即可获得不同类型卡的选择。 

事实上,这是一种美好的愿望,要实现起来并不容易,而且很需要程序员有熬夜的精神。大
致伪代码实现如下:

 

class CDviece 

private: 
HANDLE dllHandle; 
public: 
typedef int( *P_InitBoard)(void ); 
P_InitBoard InitBoard; 
…(其它所有定义及声明略去) 

int InitFunction( char *dllFileName )//调用 DLL 文件 

dllHandle = LoadLibaray( dllFileName ); 
InitBoard = (P_InitBoard)FindFunction(dllHandle, “Init_Board”); 
… (其它略去) 


由于不同卡的函数名都不一样,故需要程序员按照

CDviece 所需函数进行另一 DLL 的编写,

若需要

DMC1000 控制卡时,则需要生成一个 MDMC1000.dll 如下: 

int InitBoard()