dll加载方式不同吧你是怎么加载的?LoadLibrary

解决方案 »

  1.   


    都是通过 lib文件静态加载
      

  2.   

    你可以在 CWinApp的 InitInstance与ExitInstance 中对应处理
    DLL_PROCESS_ATTACH与DLL_PROCESS_DETACH
      

  3.   


    我是要实现在DLL里边自己退出线程。
      

  4.   

    细想起来,好像是有这个问题。
    我写的一个VC6 MFC主程序静态加载DLL,DLL也会创建一个线程。主程序退出时,在DLL_PROCESS_DETACH被调用前,那个线程就已经被强行结束了,不过没有什么影响,就忽略没管。
      

  5.   

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx 里面的一段话说的事情 与我们看到的现象一致:
    ... If the process is terminating (the lpvReserved parameter is non-NULL), all threads in the process except the current thread either have exited already or have been explicitly terminated by a call to the ExitProcess function, ...但你说非MFC程序正常,就比较奇怪,我没有试过。
      

  6.   

    我试了非MFC程序,结果与MFC程序一样,在DLL_PROCESS_DETACH被调用前,除了一个线程以外,其它线程已经被强行结束了。
      

  7.   

    不要在dllMain写复杂代码,容易死锁。如果主线程需要退出,应该通知工作线程结束。
      

  8.   


    我现在是要开发一个dll库给IE Activex控件使用,当IE进程关闭时,需要先调用deinit接口释放资源和关闭线程。但IE貌似不会通知Activex要退出。
      

  9.   


    我现在是要开发一个dll库给IE Activex控件使用,当IE进程关闭时,需要先调用deinit接口释放资源和关闭线程。但IE貌似不会通知Activex要退出。增加一个接口,这个接口的用处就是通知activex创建的线程退出,用脚本调用该接口即可。你看,别人做的页面关闭时会弹出个对话框,关闭IE时应该可以用自动调用脚本的。调用脚本时,调用一次新增的activex接口就可以了。
      

  10.   


    我现在是要开发一个dll库给IE Activex控件使用,当IE进程关闭时,需要先调用deinit接口释放资源和关闭线程。但IE貌似不会通知Activex要退出。你退出IE时,Active自己不是可以调用OnDestroy来进行销毁么,然后你在函数里面卸载掉你的dll和释放应该释放的资源!
    其实我不怎么看明白LZ要干得什么事情,不知道我说的对不对题!!
      

  11.   


    我现在是要开发一个dll库给IE Activex控件使用,当IE进程关闭时,需要先调用deinit接口释放资源和关闭线程。但IE貌似不会通知Activex要退出。你退出IE时,Active自己不是可以调用OnDestroy来进行销毁么,然后你在函数里面卸载掉你的dll和释放应该释放的资源!
    其实我不怎么看明白LZ要干得什么事情,不知道我说的对不对题!!刷新的页面时候,OnDestroy也会被调用,所以无法区分是IE关闭还是刷新页面。其实我一开始的问题是,为什么DLL创建的线程会在程序退出时,在进入DllMain之前就被强制退出。
    后面说的IE ActiveX,是解释我为什么非要在dll里让线程自动退出。
      

  12.   

    自己用非主流的方式解决了这个问题了。该问题的原因是,程序在退出时,会调用ExitProcess函数,
    该函数会先强制退出Dll里创建的所有线程,所以才卸载Dll,所以进入到DllMain时,线程都已经被退出了。解决办法就是"Hook" ExitProcess函数,在自定义的MyExitProcess里,
    先正常关闭所有线程和释放资源,再调用系统的ExitProcess。