程序先开一个线程A,之后弹出一个模式对话框B,在线程A结束后,要求自动关闭对话框B,我在线程A中使用SendMessage(),发送一个WM_CLOSE消息给B,结果出现非法操作提示(0X.....内存不能为读)!!!,我想实现的是程序的一个安装过程,先弹出一个模式对话框提示用户正在进行文件复制,在复制线程完成后,要自动关闭该对话框,之后继续其他工作.

解决方案 »

  1.   

    我认为你发送一个WM_CLOSE消息过去的方式是没错的,出内存错可能是因为你b窗口上的代码问题,最好还是要解决掉,你可以在B上重载CLOSE消息处理函数,看收到这消息后程序做什么了,一般这种错误都是内存越界造成的,你仔细检查下。
      

  2.   

    部分代码如下,请帮忙看看:
    单击一个菜单项德执行函数如下:
    void CMainFrame::OnGo() 
    {
    // TODO: Add your command handler code here
    pwork=AfxBeginThread((AFX_THREADPROC)work,this);//开线程CD2 m_dlg;
    //HWND hh=m_dlg.m_hWnd;
    m_dlg.DoModal();
    打开一个提示模式对话框
    //这里需要关闭对话框CD2
    //继续打开一个新对话框CD1
    CD1 m_ff;
    m_ff.DoModal();
    }
    #include "stdafx.h"
    #include "work.h"
    #include "MainFrm.h"
    #include "xxz.h"
    UINT work(LPVOID pParam)
    {
    CMainFrame *plg=(CMainFrame *)pParam;
    plg->aa="efg";
    Sleep(2000);
    plg->GetActiveWindow()->PostMessage(WM_CLOSE,0,0);//这里出事
    return 0;
    }另外我无论如何也不能在线程里使用任意一个对话框对象CD1,CD2,
    在线程从cpp中#include "D2.h"
    在线程函数work中,以构建D2对象,即提示对话框标识符IDD_DIALOG2未声明,不解???
      

  3.   

    部分代码如下,请帮忙看看:
    单击一个菜单项的执行函数如下:
    void CMainFrame::OnGo() 
    {
    // TODO: Add your command handler code here
    pwork=AfxBeginThread((AFX_THREADPROC)work,this);//开线程CD2 m_dlg;
    //HWND hh=m_dlg.m_hWnd;
    m_dlg.DoModal();
    打开一个提示模式对话框
    //这里需要关闭对话框CD2
    //继续打开一个新对话框CD1
    CD1 m_ff;
    m_ff.DoModal();
    }
    #include "stdafx.h"
    #include "work.h"
    #include "MainFrm.h"
    #include "xxz.h"
    UINT work(LPVOID pParam)
    {
    CMainFrame *plg=(CMainFrame *)pParam;
    plg->aa="efg";
    Sleep(2000);
    plg->GetActiveWindow()->PostMessage(WM_CLOSE,0,0);//这里出事
    return 0;
    }另外我无论如何也不能在线程里使用任意一个对话框对象CD1,CD2,
    在线程的.cpp中#include "D2.h"
    在线程函数work中,一构建D2对象,即提示对话框标识符IDD_DIALOG2未声明,编译不过,不解???
      

  4.   

    plg->GetActiveWindow()->PostMessage(WM_DESTROY,0,0);//
      

  5.   

    pwork=AfxBeginThread((AFX_THREADPROC)work,this);//开线程
    CD2 m_dlg;             // 这里是个局部的变量,你在线程咋发消息给它啊!!
    //HWND hh=m_dlg.m_hWnd;
    m_dlg.DoModal(); plg->GetActiveWindow() 估计你是想获取当前CD2 m_dlg; 的指针吧,它不对的!!!建议你把CD2 m_dlg;做为 CMainFrame的成员,
    plg->m_dlg.PostMessage(WM_DESTROY,0,0);//
      

  6.   

    http://blog.csdn.net/wanglei5695312/archive/2010/05/31/5635805.aspx