typedef struct     

CWMSXM4TestDlg* dialog;
HWND hwnd;
}Mystruct;BOOL CWMSXM4TestDlg::OnInitDialog()
{
// TODO: 在此添加额外的初始化代码 Mystruct mystr;
mystr.dialog = this;
mystr.hwnd = this->m_hWnd;
    
CreateThread(NULL,0,VIPProc,&mystr,0,NULL); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}DWORD WINAPI VIPProc(LPVOID paraMeter)
{
Mystruct* str = (Mystruct*)paraMeter;
CWMSXM4TestDlg* dialog = (CWMSXM4TestDlg*)str->dialog;
HWND hwnd = str->hwnd;
        
        dialog->MessageBox(L"");}
VIPProc里面接受到的CWMSXM4TestDlg的m_hwnd已经是NULL了。dialog->MessageBox(L"");会报错。

解决方案 »

  1.   

    注意一下你传到线程中结构体的生命周期线程是异步的,你传过去的只是一个指针你这里Mystruct 这个结构体在初始化函数返回的时候已经没有了,这个指针是空的
    所以线程中是没效的另外你这里只需要将this指针传给线程就可以了
    你结构体中的都是一个this指针就可以得到了
      

  2.   

    你的代码这样修改就可以了BOOL CWMSXM4TestDlg::OnInitDialog() 

    // TODO: 在此添加额外的初始化代码    
    CreateThread(NULL,0,VIPProc,&this,0,NULL); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 
    } DWORD WINAPI VIPProc(LPVOID paraMeter) 

    CWMSXM4TestDlg* dialog = (CWMSXM4TestDlg*)paraMeter; 
    HWND hwnd = dialog->hwnd; 
            
            dialog->MessageBox(L""); } 
      

  3.   


    在线程中,还需要用到m_hWnd的,只是我没贴出来,
    记得以前遇到过,用this->m_hWnd是不行的。
      

  4.   

    改成这样
    Mystruct *mystr=new Mystruct; 
    mystr->dialog = this; 
    mystr->hwnd = this->m_hWnd;  CreateThread(NULL,0,VIPProc,(LPVOID)mystr ,0,NULL);
      

  5.   

    此处出错确实是因为你的mystr的生命周期结束导致的
    this->m_hWnd不行除非是你初始化对话框后立即关闭了
      

  6.   

    CreateThread(NULL,0,VIPProc,&Mystruct(mystr),0,NULL);
      

  7.   

    hwnd不是已经传进去了吗?  用这个就行了就算你把dialog 传过去了,也不能用这个指针,因为你新建的线程的映射表并没有维护这个窗口句柄和窗口类对象映像,如果你用这个指针调用设计GDI的操作时,就会因为CWnd::AssertValid()出现断言错误
      

  8.   

    dialog->MessageBox()会出错,就是因为dialog里面的hwnd丢失了。如果直接传this是可以用的。但是我需要用到两个参数。所以加了个struct。应该就是他的生命周期到了,我想办法把他弄成类变量试试。
      

  9.   

    行了,把结构体定义在了stdafx里面。
    typedef struct     

    LPVOID dialog;
    HWND hwnd;
    }Mystruct;
    在CWMSXM4TestDlg.h里加入Mystruct mystr;BOOL CWMSXM4TestDlg::OnInitDialog() 

    // TODO: 在此添加额外的初始化代码 mystr.dialog = this; 
    mystr.hwnd = this->m_hWnd; 
        
    CreateThread(NULL,0,VIPProc,&mystr,0,NULL); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 
    } DWORD WINAPI VIPProc(LPVOID paraMeter) 

    Mystruct* str = (Mystruct*)paraMeter; 
    CWMSXM4TestDlg* dialog = (CWMSXM4TestDlg*)str->dialog; 
    HWND hwnd = str->hwnd; 
            
            dialog->MessageBox(L""); }
      

  10.   

    不建议这么用,因为该线程没有维护窗口的映像表,无法确定窗口的有效性工作线程在实际运行的时候如果无法在永久映射中找到HWND对应的CWnd对象,就会创建一个临时CWnd对象包装此HWND,并将它们记入临时映射表中.当程序空闲时(OnIdle()),会删除所创的临时窗口对象.此后对该CWnd的引用都将引发上述的断言出错
      

  11.   


    我本来也想写在DIALOG里面的。但VS2005里面,好像线程函数没办法写在窗口函数里面啊,会报错。 这样线程函数就是个全局函数,没办法引用窗口成员。
    Mystruct* str = (Mystruct*)paraMeter; 这句就不行了。