关于回调函数的一些有关问题

关于回调函数的一些问题
前提:今天在研究回调函数,看了不少的例子,这个例子算是比较经典的,但是看后有一下几个地方不明白,请高人指点

1.在ListCtrlButton.h头部中定义回调函数指针:
typedef int (*EditCallFunc)(CWnd *, int, int);

2.在CListCtrlButton类中定义:
EditCallFunc m_func;

3.然后在OnClicked()消息响应中应用此函数:
void CListCtrlButton::OnClicked() 

  m_func(m_pParentList, m_iItem, m_iSubItem); //// 问题1
  OnEditEnd();
}

4.在我封装的MMListCtrl接口类中这样使用:
// MMListCtrl.h中
void SetButtonEx(int iColumn, int iRow, int iIndex, int (*)(CWnd *pWnd, int iItem, int iSubItem));

//MMListCtrl.cpp中
void CMMListCtrl::SetButtonEx(int iColumn, int iRow, int iIndex, int (*fSetClickButton)(CWnd *, int, int))

  if (m_ListCtrlButton[iIndex].m_hWnd == NULL)
  {  
  m_ListCtrlButton[iIndex].CreateEx(this->GetParent(), this);
  m_ListCtrlButton[iIndex].Insert(iColumn, iRow);
  m_ListCtrlButton[iIndex].m_func = fSetClickButton; //// 问题二
  }
  else
  {
  m_ListCtrlButton[iIndex].Insert(iColumn, iRow);
  m_ListCtrlButton[iIndex].m_func = fSetClickButton;
  } 
}

5.下面就是用户类中调用的使用,假设已经声明CMMListCtrl m_List;
在用户类EditListCtrlDlg.h的头部声明:
int SetMyDlg2(CWnd *pWnd, int iItem, int iSubItem);

//EditListCtrlDlg.cpp中
BOOL CEditListCtrlDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
  //注意最后一个参数为函数指针
  m_List.SetButtonEx(0, 0, 1, SetMyDlg2);
}

//最后是此函数的实现
int SetMyDlg2(CWnd *pWnd, int iItem, int iSubItem)
{
  CString strText;
  COleTest dlg;

  if (dlg.DoModal() == IDOK)
  {
  strText = "dyx1024@gmail.com";
  }

  ((CListCtrl *)pWnd)->SetItemText(iItem, iSubItem, strText);

  return 0;
}


问题一:m_func(m_pParentList, m_iItem, m_iSubItem); 这部是用来做什么用的,为什么我自己写了一个类似的,但是为什么我m_func的地址是00000
问题二:m_ListCtrlButton[iIndex].m_func = fSetClickButton; 这个又是干什么用的
问题三:这个回调函数在什么时候执行?
  是在m_List.SetButtonEx(0, 0, 1, SetMyDlg2);的时候执行还是在OnClicked的时候执行

------解决方案--------------------
1、执行 m_func 所指向的函数。
2、将这个fSetClickButton函数地址赋给 m_func 
3、SetButtonEx()中只是将函数地址给了m_func,真正的执行还是在OnClicked里
------解决方案--------------------
当然会出错,因为m_hwn这个函数指针没有指向任何一个函数,所以会中断。
------解决方案--------------------
m_hwn 是个函数指针,你没有指向任务函数体,就好比你访问了一个没有初始化的字符串指针一样,当然会报错。

你要把一个函数名赋给m_hwn
------解决方案--------------------
只提供整个应用算法的整体设计框架,不考虑具体实现, 将具体的实现通过接口提供的函数指针让使用者根据自己的使用需求,自己去实现关于自己的应用的算法。

回调函数是算法设计的框架更灵活吧。