我写了一个DLL,在载入此DLL的同时会打开一个子线程(子线程的程序在此DLL中),此子线程一直要到此DLL卸载的时候才结束。卸载此DLL之后,进程继续运行。我卸载DLL的时候总是出错,最后检查下来估计是在卸载DLL的时候,那线程还在运行导致的。我是用FreeLibrary卸载DLL。在调用FreeLibrary之前,无法关闭子线程。请问,用什么办法可以正确的卸载此DLL麽?
编程环境是:VC++.NET 2003建立的dll项目是:MFC DLL

解决方案 »

  1.   

    一般是先给子线程一个消息,让他准备退出
    然后卸载线程等待子线程退出 WaitForSingleObject
    最后卸载
      

  2.   

    线程在使用DLL为何还要卸载?
      

  3.   

    DLL在中导出一个接口,该接口用来停止thread乐,FreeLibrary之前,调用该接口了.
    不过呢,强行的结束thread会导致一些资源无法释放掉.
      

  4.   

    ...子线程中打开了一个窗口,我向窗口发送WM_CLOSE消息了,窗口也接收到这个消息了,但是就是不会关闭,怪,郁闷。
    直接点窗口上边的叉,窗口也是接收到一个WM_CLOSE消息,但是为什么直接点上边的叉能关闭,卸载DLL的时候向窗口发送WM_CLOSE消息就关闭不了呢?
      

  5.   

    啊,太没有天理了,从其他进程里发消息给那个窗口,也可以关闭,就是卸载DLL的时候发消息关闭不了。啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
      

  6.   

    结束前进到那个线程里,直接PostQuitMessage行不行?
      

  7.   

    设一个全局变量,假如为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;
    }
      

  8.   

    你们说的都有道理,但是还是没有解决我的问题,我的问题是在卸载DLL的时候向子线程中用DoModal()打开的窗口发送WM_CLOSE消息时关闭不了那窗口。只要那窗口关闭了,线程就结束了。