基于对话框 GetDlgItem debug assertion failed

fzlrpsun 2012-02-29 08:15:02
debug assertion failed
file winocc.cpp
line 76


void CCheckDlg::LogFile()
{
CString strLogMsg;
CListBox *pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX_LOGS);//这句出错
strLogMsg.Format("welcome");
pListBox->AddString(strLogMsg);
}


CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd));

if (m_pCtrlCont == NULL)
return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
else
return m_pCtrlCont->GetDlgItem(nID);
}

出错位置在这句
ASSERT(::IsWindow(m_hWnd));



我重新新建了一个,添加了个button1 ,没有其他函数和类
void CDialogDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString strLogMsg;
CListBox *pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX_LOGS);
strLogMsg.Format("welcome");
pListBox->AddString(strLogMsg);
}

运行没有问题
...全文
180 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzlrpsun 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 heksn 的回复:]

线程中不能直接调用窗口指针 应该通过窗口句柄以消息的方式进行访问
[/Quote]
嗯,我今天发现这个问题了 就是因为把GetDlgItem放在线程中了
但是不知道怎么弄,我还是初学C++ 这些东西不太了解 麻烦具体的说下 谢谢了
  • 打赏
  • 举报
回复
线程中不能直接调用窗口指针 应该通过窗口句柄以消息的方式进行访问
firefly3233 2012-02-29
  • 打赏
  • 举报
回复
你试一下,在对话框上,先把LISTBOX的内容保存到一块内存中,如char* m_p,在类外引用.
xiaohuh421 2012-02-29
  • 打赏
  • 举报
回复
首先你要保证窗口已经存在
再有,你最好不要用线程去更新界面,应该发消息让窗口自己更新
我也遇到过,在线程中通过窗口指针去调用界面更新的函数,全导致程序崩溃.后改成消息,让其自己更新.
fzlrpsun 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 firefly3233 的回复:]

ofstream oLogFile???
是什么?模态对话框,还是非模态对话框?
[/Quote]
这一段时想把日志写入txt文件的
后面同时想把日志在对话框上显示 所以又加了个LISTBOX
firefly3233 2012-02-29
  • 打赏
  • 举报
回复
ofstream oLogFile???
是什么?模态对话框,还是非模态对话框?
fzlrpsun 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 firefly3233 的回复:]

CCheckDlg对话框没有建立前或消毁后,你调用了LogFile()函数了吧?
[/Quote]
麻烦再看下 5楼
fzlrpsun 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]

你的LogFile函数是在哪里调用的?调用之前你的对话框窗口有效?
[/Quote]

有个按钮 connect
void CCheckDlg::OnConnect()
{
// TODO: Add your control notification handler code here

hThread=CreateThread(NULL,
0,(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_DISCONNECT)->EnableWindow(TRUE);

}

然后 LogFile 是在 ThreadFunc中调用的
fzlrpsun 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 firefly3233 的回复:]

CCheckDlg对话框没有建立前或消毁后,你调用了LogFile()函数了吧?
[/Quote]
你怎么知道

ofstream oLogFile(logFileName.c_str(), ios::app);
。。。。。
。。。。。
oLogFile.close();

之后是
CString strLogMsg;
CListBox *pListBox = (CListBox*)GetDlgItem(IDC_LISTBOX_LOGS);//这句出错
strLogMsg.Format("welcome");
pListBox->AddString(strLogMsg);


请问解决办法
Eleven 2012-02-29
  • 打赏
  • 举报
回复
你的LogFile函数是在哪里调用的?调用之前你的对话框窗口有效?
firefly3233 2012-02-29
  • 打赏
  • 举报
回复
CCheckDlg对话框没有建立前或消毁后,你调用了LogFile()函数了吧?
hdg3707 2012-02-29
  • 打赏
  • 举报
回复
查一下IDC_LISTBOX_LOGS这个ID的值是否和别的ID重复了,在resource.h看

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧