我建了个对话框项目(名字叫sniffersys),但是在按钮的触发线程中要访问CsniffersysDlg中的CButton m_status;(一个按钮)
CListBox m_list;(一个列表框)
请问这个应该如何来实现?
如果我把线程中的变量定义为全局变量,在程序编译过后链接的时候所有定义为全局变量的变量又会出现错误:
error LNK2005: "int ittl" (?ittl@@3HA) 已经在 sniffersys.obj 中定义sniffersysDlg.obj请问这个是什么原因?问了很久了,难道高手们是觉得太简单还是嫌麻烦而不愿意解答?请帮帮我,谢谢

解决方案 »

  1.   

    你创建线程时把CsniffersysDlg指针作为lpParam传过去.然后
    CsniffersysDlg* p=(CsniffersysDlg*)lpParam;
    p->你需要的调用
      

  2.   

    谢谢tooker(小菜)
    用你的方法可以运行,但是运行的时候会发生错误而退出,错误就是在列表框添加项的时候,我现在是这样定义的,请大家帮我分析下有什么错误:class CsniffersysDlg : public CDialog
    {
    public:
    CButton m_status;
    CListBox m_list;CsniffersysDlg* param;
    }
    在按钮按下后:
    _beginthread(snifferthread,0,param);snifferthread的定义:
    void snifferthread(PVOID param)
    {
    CsniffersysDlg* p = (CsniffersysDlg*)param;
    p->m_list.AddString(str);
    p->UpdateData(false);
    }
      

  3.   

    你终于来了哈
    程序非法退出
    我找到个类似的例子,好像也和我一样的情况:
    http://community.csdn.net/Expert/topic/4197/4197342.xml?temp=.9876673
      

  4.   

    p->m_list.AddString(str);
    p->UpdateData(false);
    这样使用好像不太好,
    在 CsniffersysDlg中,操作list,看有问题吗,如没有.可以这样,
    把p->m_list.AddString(str); p->UpdateData(false);这些你需要的动作,
    做在一个函数里面,然后调用 .
    还要注意的是变量保护
      

  5.   

    在CsniffersysDlg操作list是可以的
    但是在线程中就是不能操作,就算做在一个函数里面,还是不行,程序出错退出,应该怎么办?还有就是全局变量怎么定义呢?
    在CsniffersysDlg.h中只能定义全局函数,如果我定义一个变量,比如CString str;编译通过,但是在链接的时候会出错,说它已经在sniffersys.obj中定义,是不是CsniffersysDlg.h中不能定义全局变量?
      

  6.   

    如何在线程添加自定义消息?又如何在窗口中接收消息呢?
    我刚接触mfc,对消息机制还不清楚