DLL中的非模式对话框,在什么时候会出现用IsWindow判断返回False的情况.(内详)
在一个dll中,我有一个非模式的对话框,在dll被调用的时候创建,创建完后利用
ShowWindow(SW_Hide)隐藏,
在该dll中有一个该对话框的指针m_pDlg;
在需要的显示对话框的时候,通过利用m_pDlg来发一个自定义的消息,使得该对话框显示出来.
但是我现在碰到的问题是,有的时候(没有找到规律),发现利用IsWindow(m_pDlg)来判断,发现返回false,m_pDlg对象的hwnd为0.
这样将导致不能发送消息了.
这个问题不是必然重现的,但是重现的几率还是比较高的.
请问,在哪些情况下会出现如上的问题,
是否与是在dll中,需要进行资源切换有关.
怎么解决,给点思路也好.
万分感谢.
问题点数:200、回复次数:18Top
1 楼harrypotter(哈里*波特)回复于 2003-12-05 21:23:34 得分 0
up
Top
2 楼matiao(麻条)回复于 2003-12-05 21:45:54 得分 20
试一下一开始就把HWND Detach 出来,保存hwnd而不是g_pDlg.Top
3 楼ross33123()回复于 2003-12-06 08:07:28 得分 30
你的m_pDlg到底是什么类型?
如果是指针,IsWindow(m_pDlg)能通过编译吗?
如果是对象,那么MFC类的很多对像是不能直接拷贝的,
你是不是把它作为全局变量,保存了自动变量的一份拷贝呢?
由于没有看到你的源代码,所以只能猜测。Top
4 楼ablefirst(able)回复于 2003-12-06 08:24:52 得分 10
void CMy6Dlg::OnOK()
{
// TODO: Add extra validation here
//dlg.DoModal();
if (!dlg.GetSafeHwnd())
dlg.Create(IDD_DIALOG1,NULL);
dlg.ShowWindow(SW_SHOW);
// CDialog::OnOK();
}
这是一个窗口打开另一个窗口,也是非模态的,你用GetSafeHwnd试试Top
5 楼lygfqy(风清扬)回复于 2003-12-06 09:13:47 得分 10
为什么不用IsWindowEnable()
IsWindowVisible()来判断呢
窗口句柄,生成之后应该也有返回
这样处理起来应该是比较容易的Top
6 楼Cline(营营[无意苦争春,贯看群芳谢])回复于 2003-12-06 09:29:30 得分 10
同意 ross33123() !
Top
7 楼COOL099(Alan Zjou)回复于 2003-12-06 17:42:30 得分 10
CMy6Dlg::OnOK()
CMy6Dlg 是什麼對話框.同dlg是一個東西嗎?Top
8 楼harrypotter(哈里*波特)回复于 2003-12-06 20:28:03 得分 0
对不起,我没有把问题说清楚.是这样的.
整个程序的结构是用多文档视图,每个视图都是一个DLL.
其中一个DLL中的内容包括一个从CFormView派生视图类CAView,一个从CDialog派生类派生的对话框类CMyDlg.
当主框架要生成CAView类的时候,在CAView类的OnCreate中创建了CMyDlg的对象m_pDlg(是CAView的一个成员),然后把该对话框隐藏起来,根据用户在CAView上的控件的一些操作,show CMyDlg和hide CMyDlg(这个过程是通过给CMyDlg类发送自定义消息来实现的).在给CMYDlg发送自定义消息的时候,在CAView中通过IsWindow(m_pDlg->m_hWnd)来判断CMyDlg是否还有效,因为如果IsWidnwo返回失败的话,sendmessage会弹出异常的.
我现在的问题是,在某些情况下m_pDlg->m_hWnd == 0了,而我又没有Destroy它.
所以,我想问的是,哪些情况下能出现这种情况.
谢谢楼上的各位.
Top
9 楼harrypotter(哈里*波特)回复于 2003-12-06 20:31:38 得分 0
楼上的说法用其他的办法来判断,效果是一样的啊,
我现在的问题不是用什么判断,我是想知道,为什么会出现判断返回失败的情况,而我认为再那些情况下是不能失败的啊.
上面由于IsWindow判断返回false,在接下去的地方,就没有发送自定义消息了,最终的结果就导致了应该弹出的对话框没有弹出来.Top
10 楼xiaohyy(醉大饿极)回复于 2003-12-06 22:02:05 得分 10
hwnd为0??m_pDlg是不是没有create?Top
11 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2003-12-06 23:14:04 得分 10
MK 先.Top
12 楼harrypotter(哈里*波特)回复于 2003-12-07 09:21:25 得分 0
xiaohyy(醉大饿极) :
肯定是create了的啊,我的现象是那个代码有的时候运行正确,但有的时候运行一段时间后,就不行了,dialog不能show,我调试进去一看,问题就处在那些时候,hwnd为0了,导致没有给它发消息让它show啊.Top
13 楼ross33123()回复于 2003-12-07 09:54:14 得分 10
你创建dialog 的那段代码能不能贴出来,怀疑是那里的问题。Top
14 楼xiaohyy(醉大饿极)回复于 2003-12-07 15:52:57 得分 10
创建的时候资源切换了吗?Top
15 楼harrypotter(哈里*波特)回复于 2003-12-07 20:35:01 得分 0
: xiaohyy(醉大饿极) ( )
我也怀疑是资源切换的问题,但是我进行了资源切换,我使用的是afx那个宏.
对于资源切换,我一直有个疑惑,到底什么时候应该进行资源切换,什么时候不需要,
请大侠指点.
谢谢.Top
16 楼xiaohyy(醉大饿极)回复于 2003-12-07 21:02:12 得分 10
当在dll中使用自己的资源时需要切换Top
17 楼xiaohyy(醉大饿极)回复于 2003-12-07 21:04:00 得分 60
比如调用create(IDD_DIALOG)
IDD_DIALOG是dll中的资源。这个时候就需要先切换到dll中的资源Top
18 楼harrypotter(哈里*波特)回复于 2003-12-07 22:10:18 得分 0
当在dll中使用自己的资源时需要切换:
没太理解,意思是说一个dll调用另一个dll的资源时要切换嘛,
但是如果都是再有个dll内部,还需要吗,再不需要切换的时候,切换了,有什么负作用.
望指教.谢谢.
Top




