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()