这个是相对于 FreeLibraryAndExitThread。其实你需要调用 FreeLibrary 和 ExitThread 的时候。
当 FreeLibrary 以后,返回到 ExitThread 之前,此时这个代码已经被 FreeLibrary 释放掉了。就出错了。而 FreeLibraryAndExitThread 返回后,就没有代码了。此时就不错了。
如果你在 FreeLibraryAndExitThread 后面还有代码就是编程错误了。因为线程已经退出了,代码不执行了。如果 先 ExitThread,后面的代码没有机会执行,此时在 FreeLibrary 也没有机会执行了。
当 FreeLibrary 以后,返回到 ExitThread 之前,此时这个代码已经被 FreeLibrary 释放掉了。就出错了。而 FreeLibraryAndExitThread 返回后,就没有代码了。此时就不错了。
如果你在 FreeLibraryAndExitThread 后面还有代码就是编程错误了。因为线程已经退出了,代码不执行了。如果 先 ExitThread,后面的代码没有机会执行,此时在 FreeLibrary 也没有机会执行了。
在 FreeLibraryAndExitThread 里面 FreeLibrary 后返回点还在 Kernal 里面,这是有效的。
此时在 ExitThread 是可以得,执行完成 ExitThread 后,线程就退出了。
但是这个 CALL 指令时在你的已经卸载的 DLL 中,只有 CALL 跳转后才进入 ExitThread 中。
而在 CALL 指令在 FreeLibrary 之后,就已经无效了。而 FreeLibraryAndExitThread 这个在 Kernal 中,虽然调用序列和你的是 一致的。但是 Kernal 不会释放。
当 FreeLibraryAndExitThread 在其中的 FreeLibrary 返回后调用的 CALL 指令还在 Kernal 中。
这就是区别。
但是 调用 ExitThread 这个函数的代码在你的 DLL 中。
是调用的代码。而不是被调用代码。CALL XXXX ; 这个代码在你的 DLL 中,也就是你写 ExitThread(0); 的代码中。
而 XXXX 在 Kernal.dll 中。