重用后DLL崩溃应用程序

时间:2012-11-11 19:10:51

标签: c++ c winapi dll crash

我使用的是一个使用mdi的应用程序,一个脚本可以附加到mdi窗口并从中分离,以便按需运行/停止;这个脚本加载了我的dll做了一些工作;它确实很好;但是,当我分离脚本时,一切都很好,应用程序应该卸载dll(并使用相应的thread_attach / detach和process_attach / detach操作调用dllmain)。现在,如果我尝试将脚本重新附加到winow,或者将其附加到另一个窗口,那么在dll使用一次之后 - 主应用程序崩溃了。我已经将问题解释为由dll创建的线程;胎面包裹着窗户;所以,我创建了这样的线程:

if (!hThread) hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

并且,当脚本分离时,它会像这样关闭线程(无论注释掉的行是否被注释掉):

SendMessage(hWnd, WM_DESTROY, 0, 0);
//TerminateThread(hThread, 0);
//WaitForSingleObject(hWndThread, INFINITE);
CloseHandle(hThread);
hThread = NULL;

我在这里不知道主应用程序崩溃的原因。一个不同的线程(即一个只能睡一秒钟并且循环的线程,不会造成伤害。什么给出了?

1 个答案:

答案 0 :(得分:0)

好的,这里有一些想法: 你说你的线程打开了一个窗口。您是否在线程函数中运行消息循环,或者您希望您的窗口由其他消息循环提供服务? 如果您在线程中运行自己的消息循环,则退出循环可能会也可能不会发生,具体取决于您编写它的方式。如果你使用类似的东西:

while(GetMessage(&msg, ...) // msg loop in the thread function
{
  .... 
}
DestroyWindow(hWnd);  // see comment below

然后这需要WM_QUIT而不是WM_DESTROY退出。无论如何,最好的方法是向你的窗口发送一个WM_QUIT,然后退出消息循环,然后调用DestroyWindow()来正确销毁它。 引自MSDN:

  

DestroyWindow功能   销毁指定的窗口。该函数将WM_DESTROY和WM_NCDESTROY消息发送到窗口以停用它并从中移除键盘焦点。该函数还会破坏窗口的菜单,刷新线程消息队列,销毁计时器,删除剪贴板所有权,并中断剪贴板查看器链(如果窗口位于查看器链的顶部

将WM_QUIT消息发布到窗口后,主线程应该等待窗口线程退出。以下是一些相关代码:

SendMessage(hWnd, WM_QUIT, 0, 0);  // send your quit message to exit the msg loop
if (WaitForSingleObject(hThread, 5000) != WAIT_OBJECT_0) // wait up to 5 seconds
{
    TerminateThread(hThread, -1); // bad! try to never end here
}

我希望这会有所帮助。我在一个使用窗口显示日志消息的线程日志查看器中使用它。