在用Winsocket传输文件的时候,我开辟一个线程来进行文件的接收过程
在这个线程里面要调用的函数是一个类的成员函数,如下:calss A;static UINT  recFileThread(LPVOID Parama);
{
  ........
  Connect(m_ipname,8989);
   
}其中 m_ipname是该类的一个CString 成员,执行下面线程时:
void CADlg::OnButtonrevFiles() 
{
//申明函数
UINT CADlg::recFileThread(LPVOID Parama);
//新建一个线程用来接受文件
AfxBeginThread(recFileThread,this,THREAD_PRIORITY_NORMAL);
}系统报错;
ompiling...
ADlg.cpp
E:\vc++\我的文件\A\ADlg.cpp(706) : error C2597: illegal reference to data member 'CADlg::m_ipname' in a static member function
Error executing cl.exe.好象是说在静态函数里非法引用类的成员,怎么解决呢??

解决方案 »

  1.   

    问题出在静态函数的定义,应改为
    static UINT  CADlg::recFileThread(LPVOID Parama)
    {
         ....
    }另外,函数的定义后还多了一个“;”
      

  2.   

    将类的this指针传入线程函数(LPVOID Parama),然后调用Parama->成员函数
      

  3.   

    不行了,我将代码贴出来吧.class CQQDlg : public CDialog
    {
    // Construction
    public:
    static UINT recFileThread(LPVOID Parama);
    CString pathname;
    CFile * file;
             CString m_ipname;  
    }UINT CQQDlg::recFileThread(LPVOID Parama)
    { // TODO: Add your control notification handler code here
    //创建套间字
    CFPScoket * FPScoket=new CFPScoket;
    if(!FPScoket->Create ())
    {
    AfxMessageBox("FPScoket创建失败!");
    return 0;
    }
    else
    {
    if(!FPScoket->Connect (CQQDlg.m_ipname,8989))
    {
    AfxMessageBox("连接文件传输套间字失败!");
    delete FPScoket;
    FPScoket=NULL;
    return 0;
    }
    else
    {
                .....
                       }
              }
    }
    void CQQDlg::OnButtonrevFiles() 
    {
    //申明函数
    static UINT CQQDlg::recFileThread(LPVOID Parama);
    //新建一个线程用来接受文件
    AfxBeginThread(recFileThread,this,THREAD_PRIORITY_NORMAL);
    }
    就是if(!FPScoket->Connect (CQQDlg.m_ipname,8989))这里出错啊!!高手指教啊
      

  4.   

    if(!FPScoket->Connect ((CQQDlg*)Parama->m_ipname,8989))
      

  5.   

    还是不对啊, Mackz(在相互)可不可以在我的代码上修改一下??谢谢
      

  6.   

    class CQQDlg : public CDialog
    {
    // Construction
    public:
    static UINT recFileThread(LPVOID Parama);
    CString pathname;
    CFile * file;
             CString m_ipname;  
    }UINT CQQDlg::recFileThread(LPVOID Parama)
    {
    CQQDlg *pDlg = (CQQDlg*)Parama;
    // TODO: Add your control notification handler code here
    //创建套间字
    CFPScoket * FPScoket=new CFPScoket;
    if(!FPScoket->Create ())
    {
    AfxMessageBox("FPScoket创建失败!");
    return 0;
    }
    else
    {
    if(!FPScoket->Connect(pDlg->m_ipname,8989))
    {
    AfxMessageBox("连接文件传输套间字失败!");
    delete FPScoket;
    FPScoket=NULL;
    return 0;
    }
    else
    {
                .....
                       }
              }
    }

    void CQQDlg::OnButtonrevFiles() 
    {
    //申明函数
    //static UINT CQQDlg::recFileThread(LPVOID Parama);
    //新建一个线程用来接受文件
    AfxBeginThread(recFileThread,(LPVOID)this);
    }
      

  7.   

    在void CQQDlg::OnButtonrevFiles()函数中,去掉static UINT CQQDlg::recFileThread(LPVOID Parama);,同时传入参数CQQDlg