重复使用后,DLL崩溃了
DLL crashes app after reuse
i使用一个使用MDI的应用程序,可以将脚本连接到并从需要按需运行/停止的MDI窗口;该脚本加载了我的DLL,可以做一些工作。这样做很好;但是,当我分离脚本时,全部还不错,应用程序应卸载DLL(并且它使用适当的thread_attach/distach和Process_attach/distach操作调用dllmain。现在,如果我尝试将脚本重新安装到wonow上,或将其连接到另一个窗口,则在使用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,然后在退出消息循环后,然后致电Destractwindow()正确销毁它。引用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
}
我希望这会有所帮助。我在使用窗口显示日志消息的螺纹日志查看器中使用此内容。
- DLL Made with CMake 使程序崩溃
- Qt应用程序找不到第三方DLL并崩溃
- 在 _snprintf_s() 中崩溃 "ucrtbase.dll" 与 STATUS_ILLEGAL_INSTRUCTION
- x64 位的 C++/CLI DLL 和 Exe 的应用崩溃
- 如何获取崩溃的DLL的堆栈跟踪?
- 带有合并排序的DLL不断崩溃
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- UCRTbase.dll涉及TCP通信的C ++ Windows Embedded Standard崩溃
- 防止本机C++DLL崩溃C#应用
- Omnet++(Eclipse IDE?)在运行INET项目时崩溃 - 在opplibs.dll中EXCEPTION_A
- 当我释放由CFFI生成的DLL分配的char*时,为什么我的应用程序会崩溃
- 具有C DLL的Excel-VBA有时会崩溃
- 程序在Windows中的DLL边界上使用嵌入式Python/C 代码崩溃
- MATLAB由于调用库(C++.h文件和FORTRAN.dll)而崩溃
- 调用64位C/C++DLL的C#应用程序崩溃,但运行32位版本
- 重复使用后,DLL崩溃了
- C++嵌入式 Python PyBytes_AsString导致 DLL 崩溃
- 使用 VS2010 IDE 生成的 Ruby 的 SWIG 包装器 DLL 崩溃
- Qt Creator在尝试运行OpenCV程序时崩溃.[NTDLL.dll崩溃]
- c# EXE /非托管c++ Unicode DLL链接到非托管c++ ANSI DLL崩溃