如何正确的卸载DLL?

PDD123 2008-06-10 01:56:08
我写了一个DLL,在载入此DLL的同时会打开一个子线程(子线程的程序在此DLL中),此子线程一直要到此DLL卸载的时候才结束。

卸载此DLL之后,进程继续运行。

我卸载DLL的时候总是出错,最后检查下来估计是在卸载DLL的时候,那线程还在运行导致的。

我是用FreeLibrary卸载DLL。

在调用FreeLibrary之前,无法关闭子线程。

请问,用什么办法可以正确的卸载此DLL麽?


编程环境是:VC++.NET 2003

建立的dll项目是:MFC DLL
...全文
720 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
PDD123 2008-06-11
  • 打赏
  • 举报
回复
你们说的都有道理,但是还是没有解决我的问题,我的问题是在卸载DLL的时候向子线程中用DoModal()打开的窗口发送WM_CLOSE消息时关闭不了那窗口。只要那窗口关闭了,线程就结束了。
rmb369 2008-06-10
  • 打赏
  • 举报
回复
设一个全局变量,假如为0表示线程运行,为1表示线程退出。FreeLibrary会调用DllMain函数,通知码是DLL_PROCESS_DETACH。在这个通知码中将全局变量设为1。然后用WaitForSingleObject等待线程对象的句柄。在线程中循环检测该全局变量值,当它为1时线程退出。这时WaitForSingleObject返回,然后DllMain返回,FreeLibrary返回,Dll才被卸载。

volatile ULONG g_lFlag=0;
HANDLE g_hThread=NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
UINT nThreadId;
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
g_lFlag=0;
g_hThread=_beginthreadex(NULL,0,ThreadFunc,NULL,0,&nThreadId);
break;
......
case DLL_PROCESS_DETACH:
g_lFlag=1;
WaitForSingleObject(g_hThread,INFINITE);
CloseHandle(g_hThread);
g_hThread=NULL;
g_lFlag=0;
break;
}
return TRUE;
}

UINT WINAPI ThreadFunc(PVOID pvParam)
{
......
while(g_lFlag!=1)
{
......
}
......
return 0;
}
buyong 2008-06-10
  • 打赏
  • 举报
回复
结束前进到那个线程里,直接PostQuitMessage行不行?
PDD123 2008-06-10
  • 打赏
  • 举报
回复
啊,太没有天理了,从其他进程里发消息给那个窗口,也可以关闭,就是卸载DLL的时候发消息关闭不了。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
PDD123 2008-06-10
  • 打赏
  • 举报
回复
...子线程中打开了一个窗口,我向窗口发送WM_CLOSE消息了,窗口也接收到这个消息了,但是就是不会关闭,怪,郁闷。
直接点窗口上边的叉,窗口也是接收到一个WM_CLOSE消息,但是为什么直接点上边的叉能关闭,卸载DLL的时候向窗口发送WM_CLOSE消息就关闭不了呢?
na_he 2008-06-10
  • 打赏
  • 举报
回复
DLL在中导出一个接口,该接口用来停止thread乐,FreeLibrary之前,调用该接口了.
不过呢,强行的结束thread会导致一些资源无法释放掉.
cnzdgs 2008-06-10
  • 打赏
  • 举报
回复
线程在使用DLL为何还要卸载?
DarknessTM 2008-06-10
  • 打赏
  • 举报
回复
一般是先给子线程一个消息,让他准备退出
然后卸载线程等待子线程退出 WaitForSingleObject
最后卸载
ouyh12345 2008-06-10
  • 打赏
  • 举报
回复
在线程里,做成一个循环,然后每个耗时的工作完成后,都要检查一下,是否需要退出
ouyh12345 2008-06-10
  • 打赏
  • 举报
回复
不能通知子线程?
易语言eNetIntercept.fne支持库中文名为易语言网络拦截支持库,本易语言支持库在Win9x/ME/NT/2000/XP环境下实现了对WinSock2的函数拦截 (包括如下函数:socket/closesocket/bind/listen/connect/accept/send/sendto/recv/recvfrom)。 系统中任何程序使用WinSock2的函数都会被本支持库所拦截,并使用易语言事件触发的方式处理,您可以在被触发的事件中按照相应事件的规则自由的处理其他程序的WinSock调用。如果您对WinSock或Windows网络编程不是很了解,建议您在使用本支持库前阅读WinSock等其他相关文档或教程。注意:在使用本支持库前,您必须先正确安装网络服务提供者(ESPINN.dll(NN为当前版本))文件。网络服务提供者(ESPINN.dll(NN为当前版本))文件必须是随本支持库一起附带的网络服务提供者(ESPINN.dll(NN为当前版本)),否则安装将失败。当前本支持库对应的网络服务提供者版本是1.1。安装方法:使用"网络服务安装"中的"安装"命令(注意该命令的参数一定要填写正确)。卸载方法:首先您必须确定系统中和本支持库类似的拦截/过滤软件已正确卸载或没有卸载,否则请千万不要使用卸载方法!使用"网络服务安装"中的"卸载"命令,如果本方法没有执行成功,请千万不要删除已成功安装到系统路径下的网络服务提供者(ESPINN.dll(NN为当前版本))文件,原因请见下列警告。 [ 警告 ]如果网络服务提供者(ESPINN.dll(NN为当前版本))已经安装成功,并且"卸载"命令没有成功执行,(注意:只有"卸载"命令返回"真"才代表真正成功卸载了),或根本没有使用"卸载"命令,系统路径下的网络服务提供者(ESPINN.dll(NN为当前版本))文件不可以改名、删除或移动路径,否则很有可能导致整个系统的WinSock瘫痪。如果上述情况真的发生了也不要紧,您可以将随本支持库附带的网络服务提供者(ESPINN.dll(NN为当前版本))文件再次复制到系统路径中(推荐使用此方法,因为后面的方法在些特定情况下可能不保险),或者直接执行"卸载"命令,并确定该命令是执行成功了。 易语言eNetIntercept.fne支持库为一般支持库,需要易语言系统3.7版本的支持,需要易语言系统核心支持库3.7版本的支持,提供了6种库定义数据类型,提供了37种命令。 操作系统需求: Windows 易语言官方论坛

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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