扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:陆其明 来源:blog 2007年10月19日
关键字:
// 如果想要测试改动过的DLL,请将下面的定义放开 //#define DLL_EXAMPLE_MODIFIED #ifdef DLL_EXPORT #define DLL_PREFIX __declspec(dllexport) #else #define DLL_PREFIX __declspec(dllimport) #endif /********** DLL的导出类 **********/ #define CLASS_UIID_DEF static short GetClassUIID(){return 0;} #define OBJECT_UIID_DEF virtual short GetObjectUIID(){return this->GetClassUIID();} // 所有回调处理的基本接口 struct DLL_PREFIX ICallBack { CLASS_UIID_DEF OBJECT_UIID_DEF }; #undef CLASS_UIID_DEF #define CLASS_UIID_DEF(X) public: static short GetClassUIID(){return X::GetClassUIID()+1;} // 仅当DLL_EXAMPLE_MODIFIED宏已经定义的时候,进行接口扩展 #if defined(DLL_EXAMPLE_MODIFIED) // 新增加的接口扩展 struct DLL_PREFIX ICallBack01 : public ICallBack { CLASS_UIID_DEF(ICallBack) OBJECT_UIID_DEF virtual void DoCallBack01(int event) = 0; // 新的回调函数 }; #endif // defined(DLL_EXAMPLE_MODIFIED) class DLL_PREFIX CExample{ public: CExample(){mpHandler = 0;} virtual ~CExample(){} virtual void DoCallBack(int event) = 0; ICallBack * SetCallBackHandler(ICallBack *handler); void Run(); private: ICallBack * mpHandler; }; |
if(mpHandler != NULL && mpHandler->GetObjectUIID()>=ICallBack01::GetClassUIID()){ ((ICallBack01 *) mpHandler)->DoCallBack01(2); } |
// 如果DLL_EXAMPLE_MODIFIED没有定义,使用以前版本的DLL #if !defined(DLL_EXAMPLE_MODIFIED) // 此时没有使用扩展接口ICallBack01 class CClient : public CExample{ public: CClient(); void DoCallBack(int event); }; #else // !defined(DLL_EXAMPLE_MODIFIED) // 当DLL增加了新接口ICallBack01后,客户程序可以修改自己的类 // (但不是必须的,如果他不想处理新的回调事件的话) class CClient : public CExample, public ICallBack01{ public: CClient(); void DoCallBack(int event); // 声明DoCallBack01函数(客户程序要实现它,以处理新的回调事件) // (DoCallBack01是ICallBack01接口新增加的虚函数) void DoCallBack01(int event); }; #endif // defined(DLL_EXAMPLE_MODIFIED) |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者