DLL中多线程显示对话框的问题

crossrowman 2009-06-20 01:22:21
 __declspec(dllexport) void Fun1()
{
DWORD threadID;
CreateThread(NULL,0,&ThreadFrm,NULL,0,&threadID);
//挂起线程等待窗口唤醒
SuspendThread(ThreadHandle);
}
DWORD WINAPI ThreadFrm(LPVOID pParam)
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 这个好像不起作用
pFrmMain = new CFrmMain(); //这里是一个对话框 窗口上面放一个CListBox控件

pFrmMain->pListIns.AddString( (LPCTSTR)"dadsds"); //在CListBox控件上添加一个字符串

pFrmMain->DoModal(); //显示窗口
ExitProcess(0);

return 0;
}


运行环境 VS2008 C++ 非托管 支持MFC

问题是:
上面这段代码在DEBUG下老是提示出错 :Debug Assertion Failed!
跟进出错的位置如下:
_AFXWIN_INLINE int CListBox::AddString(LPCTSTR lpszItem)
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }
m_hWnd 的值好像是0

这段代码在RELEASE下可以显示对话框 但是 在CListBox上添加的字符串却没有显示在控件上 ???


搞了一大半夜了,希望知道的帮下 先谢过了。
...全文
123 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gleen 2009-06-20
  • 打赏
  • 举报
回复
要在 创建线程之前 先创建窗口啊
lambert_s 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hhyttppd 的回复:]
在你的线程里先驱动起消息循环,谢谢。
[/Quote]
请赐教?
我以前也想过这种方法,可惜不会搞。。。
hhyttppd 2009-06-20
  • 打赏
  • 举报
回复
在你的线程里先驱动起消息循环,谢谢。
arong1234 2009-06-20
  • 打赏
  • 举报
回复
想办法在你对话框中用一个CStringArray保存你要加的字符串,在DoModal之前只把字符串加入这个array,然后在OnInitDialog中,在把array中的加入ListBox
arong1234 2009-06-20
  • 打赏
  • 举报
回复
而且用LPCTSTR做强制类型转换也非常错误,"abcde"不一定河LPCTSTR兼容(在vs2008中缺省是unicode编译,因此缺省不兼容),你应该用_T("abcde")而不是(LPCTSTR)"abcde"
arong1234 2009-06-20
  • 打赏
  • 举报
回复
DoModal之前窗口显然都还没有创建,而没有创建之前,AddString是非法的,ListBox必须等窗口创建完成后才能增加内容
AddString的调用必须放到OnInitDialog之后,EndDialog之前,否则必然导致你说的问题
[Quote=引用楼主 crossrowman 的帖子:]
DWORD WINAPI ThreadFrm(LPVOID pParam)
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 这个好像不起作用
pFrmMain = new CFrmMain(); //这里是一个对话框 窗口上面放一个CListBox控件

pFrmMain->pListIns.AddString( (LPCTSTR)"dadsds"); //在CListBox控件上添加一个字符串

pFrmMain->DoModal(); //显示窗口
ExitProcess(0);

return 0;
}
[/Quote]
程序员刘帅 2009-06-20
  • 打赏
  • 举报
回复
DWORD WINAPI ThreadFrm(LPVOID pParam)
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 这个好像不起作用
pFrmMain = new CFrmMain(); //这里是一个对话框 窗口上面放一个CListBox控件

//这里窗口只是new出来了,还没有Create啊,所以ListBox控件还没有创建,不能AddString pFrmMain->pListIns.AddString( (LPCTSTR)"dadsds"); //在CListBox控件上添加一个字符串

pFrmMain->DoModal(); //显示窗口
ExitProcess(0);

return 0;
}
「已注销」 2009-06-20
  • 打赏
  • 举报
回复
其次,CFrmMain是否需要HINSTANCE?传入了没有?
对话框的资源是否在DLL中?加载是否正确?

另,我不知道你CFrmMain如何实现,但 pFrmMain = new CFrmMain(); 只是
创建了一个CFrmMain对象,并不一定创建了对话框。
是否还需要调用
pFrmMain->Create(...)之类的?
另,线程的创建不应该使用CreateThread。
参考:http://www.xue163.com/html/2008828/851682.html
「已注销」 2009-06-20
  • 打赏
  • 举报
回复
你先排除一下是否多线程的问题:
__declspec(dllexport) void Fun1()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 这个好像不起作用
pFrmMain = new CFrmMain(); //这里是一个对话框 窗口上面放一个CListBox控件

pFrmMain->pListIns.AddString( (LPCTSTR)"dadsds"); //在CListBox控件上添加一个字符串

pFrmMain->DoModal(); //显示窗口

}

看这样能运行吗?是否有断言?是否显示字符串?
lori227 2009-06-20
  • 打赏
  • 举报
回复
线程执行的时候窗口还没创建的~~ 所以不会有显示! 需要你做一下处理的~~等待或者sleep啥的 你试试看~~
lori227 2009-06-20
  • 打赏
  • 举报
回复

if (pFrmMain->pListIns.m_hWnd != NULL)
{
pFrmMain->pListIns.AddString( (LPCTSTR)"dadsds"); //在CListBox控件上添加一个字符串

pFrmMain->DoModal(); //显示窗口
ExitProcess(0);

}
//加一个判断!

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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