我的DLL中Create了一个窗口,但是在DLL的ExitInstance() 函数中调用该窗口的DestroyWindow()函数时,afxMapHWND()返回的HandleMap 是NULL的断言失败为什么???

AriDo 2001-06-29 03:16:23
以下是涉及出错的代码(被包装在DLL中)

CMyWnd *m_pMyWnd;

BOOL CDLLApp::InitInstance()
{
...
if (m_pMyWnd->Create(NULL) == FALSE)
return FALSE;
...
return CWinApp::InitInstance();
}

int CDLLApp::ExitInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
...
if (m_pMyWnd != NULL)
{
m_pMyWnd ->DestroyWindow();
m_pMyWnd = NULL;
}

...
return CWinApp::ExitInstance();
}

在CWnd::DestroyWindow()中 CHandleMap* pMap = afxMapHWND(); 返回的pMap为NULL。然后断言失败。
我跟了一下原因可能是afxMapHWND()函数中的
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
返回的pState指向的地址并不是当前DLL的导致afxMapHWND()返回为NULL。但是不知道怎么解决。请大家帮忙!!!
...全文
598 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kock 2001-07-02
  • 打赏
  • 举报
回复 1
这样么。一般这样的话,Init/Exit都应该在程序的主县城中才对。(要百分百确定,可以弹个对话框报告一下当前现成的ID)
那搞不清楚了。
那个窗口不在DLL外面用吗?跟操作有没关系?会不会已经关了(IsWindow确认下)?

AriDo 2001-07-02
  • 打赏
  • 举报
回复
对了怎么送份给某个人呢???
AriDo 2001-07-02
  • 打赏
  • 举报
回复
那个主进程有多个线程,但是那个DLL是隐式调用,当主进程启动时DLL就要m_pMyWnd = new CMyWnd了!好象不存在在其他线程中创建的嫌疑吧。还有若这个应用程序不进行任何操作,直接退出就没有事,但是怎么可以不进行其他操作呢。有一个方法就是不在ExitInstance中DestroyWindow而是增加一个输出函数让用户退出程序时显示的调用一下,比如End()什么的,但是我觉得那样做太老土了,而且容易被忘记。
kock 2001-07-02
  • 打赏
  • 举报
回复 1
那主程序是不是多线程?那个窗口不在主线程创建?
AriDo 2001-07-02
  • 打赏
  • 举报
回复
应该是DLL中的主线程,是在DLL中的CWinApp类的ExitInstance函数中出的错。应该和AfxBeginThread没有什么瓜葛吧。这个DLL是隐式调用。是在主应用程序启动时就加载的。
kock 2001-07-02
  • 打赏
  • 举报
回复
或者线程不是AfxBeginThread来的?
kock 2001-07-02
  • 打赏
  • 举报
回复
偶也不知.
InitInstance 作AfxGetModuleThreadState()?
设个断点看下当前线程ID.
不是同一线程的CWND不能混用.
参见MSDN

AfxGetModuleThreadState()只是返回某个变量,可能没有初始化或清掉了.
AriDo 2001-07-02
  • 打赏
  • 举报
回复
好象是,但那是为什么呢?调用DLL的ExitInstance()和InitInstance()函数时会不在一个线程上吗?当调用DLL的ExitInstance()的函数时为什么用AfxGetModuleThreadState()得到的当前进程的当前线程的State会是NULL呢?是表示当前进程没有线程运行吗?说不过去呀!
kock 2001-07-02
  • 打赏
  • 举报
回复 1
"管理"功能.
是不是创建/销毁不在同一个线程?
分别取当前线程看看.
AriDo 2001-07-01
  • 打赏
  • 举报
回复
上面的代码不是用来调用DLL的而是DLL中的一段,其中的CDllApp是DLL中的WinApp类。
xxxbird 2001-06-29
  • 打赏
  • 举报
回复

Maybe you should use:

static CMyWnd *m_pMyWnd;

RedFire 2001-06-29
  • 打赏
  • 举报
回复
看不太明白,你上面这段程序是用来调用DLL的吧?

16,472

社区成员

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

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

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