对外回调设计结合DLL应用

来源:互联网 发布:网络标志图标 编辑:程序博客网 时间:2024/05/20 21:49

       在程序开发中常常要使用模块设计,类似QQ的界面一个模块,通用功能common一个模块等等,一般会封装到一个DLL文件中,编写模块的时候程序员都尽力达到低耦合,就是模块中不要有太多的牵连,比如在我在一个对话框实现一个打印文件的函数方法,后来另一个窗口中要调用打印的功能,怎么办呢?

1.在这个窗口重新写一次这个功能

2.定义一个有那个打印函数的指针

如果你的功能中需要那个有打印函数对话框中内部拥有的变量进行使用那第一种办法就麻烦好多了,而使用第二种办法的话,那两个窗口本来可以认为是两个模块的东西,就牵连起来了程序中的耦合度就变高,了这是设计的时候应该注意的。呵呵这里只是说明一下并不是解决问题,因为程序是不可能模块间没耦合的。

 

        模块设计的好处挺多的,用在更新程序就是很重要的。比如

 

 一。下面是作为使用DLL者来设置回调函数的应用

    我曾经得到用DLL,别人的模块,那个假设为realname.dll它提供了很多函数接口,其中就有一个Seterrornotify用来设置一个回调函数的,设置一个回掉函数来返回它那个DLL执行的时候的一些错误返回值,这样我才知道我它工作时候是否正常,因为它内部有个线程自己一直在运行做一些事情。

假设回调函数是这样 void errornotify(int nerrofcode);

 

一般我们知道回调函数两种:

1 .类函数就是static函数才可以作为回调函数,

2.不然就是在类外定义一个全局函数,

所以我们用static 函数

static void errornotify(int nerrorcode);

 

再定义一个static  Cxxxdlg *m_xxxdlg; 自己的窗口类的指针

 

同时记住 在构造函数中初始化 不要用 Cxxxdlg():m_xxxdlg(this)

写在 Cxxxdlg()

{

   m_xxxdlg = this;

}

 这样我们就可以这样做了呵呵,回调函数最终还是用我们的类函数来实现;能使用自己的类的方法就相当于能使用自己类的函数和成员变量而不用定义那些你想使用的函数和变量都为static 静态类型

void errornotify(int nerrorcode)

{

     m_xxxdlg->XXXX(errorcode);

}

 

 

二。 开发DLL者来设计回调函数

1.你可以设置自己的一般类变量指针作为参数传递进去

 

这里就拿使用线程来举例,回调函数的例子

CThread 自己定义一个类

 

private :

 static UINT ThreadFunction(void *pV); //静态函数,线程函数

 CThread(const CThread &rhs);
 CThread &operator=(const CThread &rhs);

protected :

 virtual int Run() = 0; //虚函数提供给外部实现多态

 

 CWinThread* m_lpThread; //MFC提供的类
 
};

 

UINT UINT CThread::ThreadFunction(void *pV)
{
 int result = 0;

 CThread* pThis = static_cast<CThread*>(pV);

 if (pThis != 0)
 {
  try
  {
   result = pThis->Run();
  }
  catch(...)
  {
   result = -1;
   //AfxMessageBox(_T("Thread Error!"));
  }
 }

 return result;
}::ThreadFunction(void *pV)
{
 int result = 0;

 CThread* pThis = static_cast<CThread*>(pV);

 if (pThis != 0)
 {
  try
  {
   result = pThis->Run(); //外部
  }
  catch(...)
  {
   result = -1;
   //AfxMessageBox(_T("Thread Error!"));
  }
 }

 return result;
}

 

这样DLL中 导出一个CThread 类给外部继承,外部使用者可以通过虚函数 Run 自己实现它线程想要的功能,

这就是回调函数使用自己类的指针,做回调函数的参数实现使用类函数的例子,同时使用虚函数实现对外的多态。

 

2.不使用类继承虚函数的多态设计

这个办法是最近我老大说重构以后,让我们看看C#和java的泛型。在网上看了点资料,有的比较复杂,我就用了一点那个思想而已,用的就是C++的模板,

 

template<class TClass>
class CXXX
{

public:
 typedef BOOL (TClass::*PDELETETIPSDLGFUN)(void);

 

 CXXX(TClass *pObj, PDELETETIPSDLGFUN pDeleteTipsDlgFun)
  :m_pObj(pObj),m_pDeleteTipsDlgFun(pDeleteTipsDlgFun)
 {


 }

 BOOL DeleteTipsDlg() //回调函数变形
 {
  return (m_pObj->*m_pDeleteTipsDlgFun)();

 }

 

private:
TClass* m_pObj; //

 

PDELETETIPSDLGFUN m_pDeleteFun;
}

 

 这样就不用继承了

有个类 CYYY它有个CXXX的成员变量:

CXXX<CYYY> m_XXX;
还有个类函数:

void deletefun();

 

在CYYY构造函数中可以初始化,

CYYY()

:m_XXX(CYYY的指针,deletefun)

 

这样CYYY这的deletefun就是外部使用的回调函数了。呵呵这里实现了不继承方式,同时也使用类函数作为回调函数

 

以上都是思想,但这些思想都用了代码实现了的。今天到这里下次再加内容。

 

 

 

原创粉丝点击