gpt4 book ai didi

c++ - 重用后 DLL 使应用程序崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:49 26 4
gpt4 key购买 nike

我使用一个使用 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;

我不知道为什么主应用程序会崩溃。一个不同的线程(即一个只会休眠一秒钟然后循环的线程,不会造成任何伤害。是什么给了?

最佳答案

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

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

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

DestroyWindow function Destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove the keyboard focus from it. The function also destroys the window's menu, flushes the thread message queue, destroys timers, removes clipboard ownership, and breaks the clipboard viewer chain (if the window is at the top of the viewer chain

向您的窗口发送 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
}

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

关于c++ - 重用后 DLL 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13334453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com