如何在callback 函数中访问类的成员变量,今天遇到了这个问题,半天才解决,
由于callback函数必须为static函数,而static函数 不能访问非static变量
其实很简单,只需要声明一个类的指针,将指针指向该类,并将该指针传入callback函数即可以对该类中的任何成员进行操作了
例如
class CGPS_zzDlg : public CDialog
{
// Construction
public:
CGPS_zzDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CGPS_zzDlg)
enum { IDD = IDD_GPS_ZZ_DIALOG };
CButton m_ButOpen;
CButton m_ButClose;
CString m_time;
CString m_lati;
CString m_longi;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGPS_zzDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CGPS_zzDlg)
virtual BOOL OnInitDialog();
afx_msg void OnBtnOpencom();
afx_msg void OnBtnClosecom();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
DCB dcb; /* 串口参数结构体 */
HANDLE m_hComm; /* 串口操作句柄 */
HANDLE m_ExitThreadEvent; /* 串口接收线程退出事件 */
CString m_strRecDisp; /* 接收区显示字符 */
BOOL ClosePort(void); /* 关闭串口 */
// 打开串口
BOOL OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity);
// 串口接收线程
static DWORD CommRecvTread(LPVOID lparam);
// 串口接收数据成功回调函数
typedef void (CALLBACK *ONCOMMRECV)(CWnd* pWnd, char *buf, int buflen);
static void CALLBACK OnCommRecv(CWnd* pWnd, char *buf, int buflen );
};
只需在callback函数中声明指向类的指针pDlg即可
void CALLBACK CGPSDlg::OnCommRecv(CWnd* pWnd, char *buf, int buflen )
{
CGPSDlg * pDlg = (CGPS_zzDlg*)pWnd;
}