回 帖 发 新 帖 刷新版面

主题:请教有关互斥量和非模式对话框唯一的问题

//点击按钮弹出非模式对话框:
void CMutexTestDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    CString strName;
    m_edtName.GetWindowText(strName);
    CMutexDlg *pdlg = new CMutexDlg(strName);
    if(pdlg->GetSafeHwnd() == NULL)
    {
        if(pdlg->Create() == TRUE)
            m_staticMsg.SetWindowText( strName + " 成功创建!");
        else            
            m_staticMsg.SetWindowText( strName + " 已经存在!");
    }
        
}

//非模式对话框内创建互斥量, 使对话框唯一,其中互斥量名为传入参数。

CMutexDlg::CMutexDlg(CString str)
{
    //{{AFX_DATA_INIT(CMutexDlg)
        m_strName = str;
    //}}AFX_DATA_INIT
}

BOOL CMutexDlg::Create() 
{
    m_hMutex = CreateMutex(NULL,TRUE,m_strName);
    if(GetLastError() == ERROR_ALREADY_EXISTS)   
    {  
        MessageBox("窗口已存在");
        CloseHandle(m_hMutex);   
        return   FALSE;   
    }   
    return CDialog::Create(CMutexDlg::IDD);
}

//关闭窗口 释放并关闭互斥量
void CMutexDlg::OnClose() 
{
    // TODO: Add your message handler code here and/or call default
    ReleaseMutex(m_hMutex);
    CloseHandle(m_hMutex);
    CDialog::OnClose();
}


这样做确实能使非模式对话框唯一,但问题是关闭对话框以后没有释放互斥量,请问为什么?有什么解决方法没?  还有怎么通知父窗口该非模式对话框已经关闭?

回复列表 (共2个回复)

沙发

附件为源代码,用vc6打开。
这是我实际中遇到的问题,提取出来演示。
请各位高手指教一下,小弟初学不久。

板凳

你在OnOK,OnCancel中调用一次OnClose就行了
或者你在DestroyWindow那里调用,在父窗口主动调用子对话框的摧毁函数也行

我来回复

您尚未登录,请登录后再回复。点此登录或注册