类之间的回调定义与使用问题

lhsxsh 2008-12-08 11:29:58
class CMySocketClient :public CWnd
{

public:
CMySocketClient(void);
~CMySocketClient(void);

public:
int InitAndConnet(HWND hwnd,unsigned int WM_WINSOCK,UINT port,CString ip);
int SendString(CString str);
int StopSocket();
int InitWSAAsyncSelect(void);
afx_msg LRESULT OnClientReceive(WPARAM wParam, LPARAM lParam);

typedef void (*CallBackFunc)(CString); --回调定义
CallBackFunc m_CallBackFunc; --回调定义
int CallBack(CallBackFunc Func); --回调定义

};

--实现--回调
int CMySocketClient::CallBack(CallBackFunc Func)
{
if(Func==NULL)
return 0;
m_CallBackFunc=Func;
return 1;

}

--触发地方--
(*m_CallBackFunc)(str); --在触发时会出错 --- 请问题类与类之间的回调要怎么定义与使用?

--- 调用类的定义--

class CCKeygoeDlg : public CDialog
{
// Construction

public:
CCKeygoeDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CCKeygoeDlg)
enum { IDD = IDD_CKEYGOE_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCKeygoeDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
//{{AFX_MSG(CCKeygoeDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButton1();
public:
afx_msg void OnBnClickedButton2();
public:
afx_msg void OnBnClickedButton3();
public:
afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);

LRESULT OnReadClose(WPARAM wParam,LPARAM lParam);
void static callback(CString str); --使用定义

public:
int m_aa;
CMySocketClient m_MySocketClient;
afx_msg void OnBnClickedOk();
};
--实现--
void CCKeygoeDlg::callback(CString str)
{

AfxMessageBox(str);

}
请问: 请问题类与类之间的回调要怎么定义与使用?是这样写的嘛?

--触发地方--
(*m_CallBackFunc)(str); --在触发时会出错 --- 请问题类与类之间的回调要怎么定义与使用?

--- 调用类的定义--
...全文
125 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤客天涯 2008-12-08
  • 打赏
  • 举报
回复
定义
void (WINAPI *m_CallBackFunc)(CString str);
--实现--回调
int CMySocketClient::CallBack(void (WINAPI *DataSvcCallBack)(CString str))
{
if(Func==NULL)
return 0;
m_CallBackFunc=Func;
return 1;

}

调用:
if(m_CallBackFunc)
{
m_CallBackFunc(str);
}
lhsxsh 2008-12-08
  • 打赏
  • 举报
回复
我的本意是想 在CMySocketClient类收到通信包后转给CCKeygoeDlg的callback函数处理。
lwx300 2008-12-08
  • 打赏
  • 举报
回复
能获取 CCKeygoeDlg 的指针吗?如果能,可以直接使用指针来显示数据,不用写回调函数。

//回调函数可能还需要定义一个变量,传入 CCKeygoeDlg 对话框的指针。静态函数才能使用这个指针更新内容。
typedef void (CALLBACK * CallBackFunc)(CString, LPVOID pData);

qiangorqiang 2008-12-08
  • 打赏
  • 举报
回复
用虚函数吧:
class IListener
{
public:
virtual callback(const CString &str) = 0;
};

class class CMySocketClient :public CWnd
{
public:
void SetListener(IListener *pListener)
{
m_pListener = pListener;
}
private:
IListener *m_pListener;
};

...

pListener->callback("msg");
wzaen 2008-12-08
  • 打赏
  • 举报
回复
估计是线程的问题。
wzaen 2008-12-08
  • 打赏
  • 举报
回复
楼主,出什么错误?
把AfxMessageBox(str); 去掉只留一个空函数,看还出不出错误呢?
lwx300 2008-12-08
  • 打赏
  • 举报
回复
m_MySocketClient.SetCallBack(CCKeygoeDlg::callback); //初始化。

void CMySocketClient::Output(CString str)
{
if (m_CallBackFunc != NULL)
{
(*m_CallBackFunc)(str);
}
}
lhsxsh 2008-12-08
  • 打赏
  • 举报
回复
按楼上的 lwx300 试了还是会错
m_MySocketClient.InitAndConnet(m_hWnd,WM_CLIENT_READCOLOSE,8888,"127.0.0.1");
m_MySocketClient.SetCallBack(callback);

我的本意是想 在CMySocketClient类收到通信包后转给CCKeygoeDlg的callback函数处理。


smallfishff 2008-12-08
  • 打赏
  • 举报
回复
类方法可以直接做回调函数?
lwx300 2008-12-08
  • 打赏
  • 举报
回复
//定义回调函数原形。
typedef void (CALLBACK * CallBackFunc)(CString);

class CMySocketClient :public CWnd
{
...

protected:
CallBackFunc m_CallBackFunc; //保存回调函数的地址,在类的构造函数中初始化为NULL。
}

//设置回调函数。
int CMySocketClient::SetCallBack(CallBackFunc Func)
{
if (Func==NULL)
return 0;
m_CallBackFunc=Func;
return 1;
}


class CCKeygoeDlg : public CDialog
{
...
static void CALLBACK callback(CString str);
}

void CCKeygoeDlg::callback(CString str)
{
AfxMessageBox(str);
}
cnzdgs 2008-12-08
  • 打赏
  • 举报
回复
代码贴的不够清楚,估计是下面的问题:
int CMySocketClient::CallBack(CallBackFunc Func)
{
if(Func!=NULL)
return 0;
m_CallBackFunc=Func;
return 1;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧