这个是相对于 FreeLibraryAndExitThread。其实你需要调用 FreeLibrary 和 ExitThread 的时候。
当 FreeLibrary 以后,返回到 ExitThread 之前,此时这个代码已经被 FreeLibrary 释放掉了。就出错了。而 FreeLibraryAndExitThread 返回后,就没有代码了。此时就不错了。
如果你在 FreeLibraryAndExitThread 后面还有代码就是编程错误了。因为线程已经退出了,代码不执行了。如果 先 ExitThread,后面的代码没有机会执行,此时在 FreeLibrary 也没有机会执行了。

解决方案 »

  1.   

    而 FreeLibraryAndExitThread 在 Kernal 里面,这个 DLL 在任何进程里面都不会主动释放的。
    在 FreeLibraryAndExitThread 里面 FreeLibrary 后返回点还在 Kernal 里面,这是有效的。
    此时在 ExitThread 是可以得,执行完成 ExitThread 后,线程就退出了。
      

  2.   

    ExitThread是在DLL里?还是在EXE里?
      

  3.   

    在 FreeLibrary 之后,会需要从你的 DLL 中继续加载代码,虽然这个代码是 ExitThread 。
    但是这个 CALL 指令时在你的已经卸载的 DLL 中,只有 CALL 跳转后才进入 ExitThread 中。
    而在 CALL 指令在 FreeLibrary 之后,就已经无效了。而 FreeLibraryAndExitThread 这个在 Kernal 中,虽然调用序列和你的是 一致的。但是 Kernal 不会释放。
    当 FreeLibraryAndExitThread 在其中的 FreeLibrary 返回后调用的 CALL 指令还在 Kernal 中。
    这就是区别。
      

  4.   

    ExitThread是在DLL里?还是在EXE里?
      

  5.   

    ExitThread  不在你的 DLL 中,也不在你的 EXE 中。在系统的 Kernal.dll 中。
    但是 调用 ExitThread 这个函数的代码在你的 DLL 中。
    是调用的代码。而不是被调用代码。CALL XXXX ; 这个代码在你的 DLL 中,也就是你写 ExitThread(0); 的代码中。
    而 XXXX 在 Kernal.dll 中。
      

  6.   

    FreeLibrary之后,Call ExitThread 还能执行吗!!不是已经和EXE脱离关系了吗