user-0 提问: 为什么要先卸载DLL再退出线程？

回复:
user: user-1
content: 引用 12 楼 HeBanBei 的回复:[quote=引用 10 楼 ID870177103 的回复:] [quote=引用 9 楼 HeBanBei 的回复:] [quote=引用 8 楼 ID870177103 的回复:] 假设现在在运行dll的代码 你可以想想程序运行的时候代码保存在哪里 函数调用时会在栈里面保存一个入口的下一个指令的地址，如果这个指针变成了野指针怎么办？ 我调用完FreeLibrary还能正确执行下一条语句吗？  我先引入两个概念：主调模块和被调模块 主调模块：可执行程序 被调模块：DLL  FreeLibrary() 是由主调模块执行的。这样没有问题吧？ [/quote]  不管FreeLibrary是谁调用的，dll的代码区都被free了，只要dll还在运行就一定会崩[/quote]  1、如果dll的代码区都被free了，而dll还在运行，那么会有问题。这一点，我知道。 2、如果FreeLibrary由主调模块执行，那么主调模块就可以等dll的线程退出之后，再调用FreeLibrary。这样就不会有问题了。那么也就没有必要使用 FreeLibraryAndExitThread() 了。[/quote]   我个人也认为FreeLibraryAndExitThread是一种错误的设计，一个dll的函数需要打开线程什么的，为什么不自己管理这个线程呢

user: user-0
content: 引用 11 楼 delandi 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 知其然容易，知其所以然难。   原来你的专家分都是这么水出来的[/quote]  说啥大实话呢。。。

user: user-0
content: 引用 10 楼 ID870177103 的回复:[quote=引用 9 楼 HeBanBei 的回复:] [quote=引用 8 楼 ID870177103 的回复:] 假设现在在运行dll的代码 你可以想想程序运行的时候代码保存在哪里 函数调用时会在栈里面保存一个入口的下一个指令的地址，如果这个指针变成了野指针怎么办？ 我调用完FreeLibrary还能正确执行下一条语句吗？  我先引入两个概念：主调模块和被调模块 主调模块：可执行程序 被调模块：DLL  FreeLibrary() 是由主调模块执行的。这样没有问题吧？ [/quote]  不管FreeLibrary是谁调用的，dll的代码区都被free了，只要dll还在运行就一定会崩[/quote]  1、如果dll的代码区都被free了，而dll还在运行，那么会有问题。这一点，我知道。 2、如果FreeLibrary由主调模块执行，那么主调模块就可以等dll的线程退出之后，再调用FreeLibrary。这样就不会有问题了。那么也就没有必要使用 FreeLibraryAndExitThread() 了。

user: user-2
content: 引用 6 楼 zhao4zhong1 的回复:知其然容易，知其所以然难。   原来你的专家分都是这么水出来的

user: user-1
content: 引用 9 楼 HeBanBei 的回复:[quote=引用 8 楼 ID870177103 的回复:] 假设现在在运行dll的代码 你可以想想程序运行的时候代码保存在哪里 函数调用时会在栈里面保存一个入口的下一个指令的地址，如果这个指针变成了野指针怎么办？ 我调用完FreeLibrary还能正确执行下一条语句吗？  我先引入两个概念：主调模块和被调模块 主调模块：可执行程序 被调模块：DLL  FreeLibrary() 是由主调模块执行的。这样没有问题吧？ [/quote]  不管FreeLibrary是谁调用的，dll的代码区都被free了，只要dll还在运行就一定会崩

user: user-3
content: 知其然容易，知其所以然难。

user: user-4
content: FreeLibraryAndExitThread  这个函数其实是 FreeLirary 和 ExitThread 的合体。  当你创建一个线程，在这个线程中是需要使用一个 DLL，那么在线程退出的时候， 你需要清理这个 DLL，那么执行的流程就是 Free and Exit。   但是不能直接呼叫这个两个 API，因为这个代码是在 DLL 中的，那么 Free 之后，返回的位置在 DLL 代码中， 而此时 DLL 已经被卸载，这是就会异常。 而 Windows 提供这个 API 就保证 Free 之后，返回的位置在 系统的 DLL 中（Kernel32.dll.），这样在呼叫 ExitThread 来退出线程。

user: user-5
content: 匪徒：打劫！男的站左边，女的站右边，不男不女站中间。老赵你站左边还是右边？ 老赵：老子哪边都不站！  引用 3 楼 zhao4zhong1 的回复:引用 2 楼 user-5 的回复:《WIndows非核心编程》  [quote=引用 1 楼 zhao4zhong1 的回复:] 《WIndows核心编程》 [/quote]

user: user-3
content: 引用 2 楼 user-5 的回复:《WIndows非核心编程》  引用 1 楼 zhao4zhong1 的回复:《WIndows核心编程》

user: user-5
content: 《WIndows非核心编程》  引用 1 楼 zhao4zhong1 的回复:《WIndows核心编程》

user: user-3
content: 《WIndows核心编程》

user: user-0
content: 引用 8 楼 ID870177103 的回复:假设现在在运行dll的代码 你可以想想程序运行的时候代码保存在哪里 函数调用时会在栈里面保存一个入口的下一个指令的地址，如果这个指针变成了野指针怎么办？ 我调用完FreeLibrary还能正确执行下一条语句吗？  我先引入两个概念：主调模块和被调模块 主调模块：可执行程序 被调模块：DLL  FreeLibrary() 是由主调模块执行的。这样没有问题吧？

user: user-1
content: 假设现在在运行dll的代码 你可以想想程序运行的时候代码保存在哪里 函数调用时会在栈里面保存一个入口的下一个指令的地址，如果这个指针变成了野指针怎么办？ 我调用完FreeLibrary还能正确执行下一条语句吗？

user: user-0
content: 引用 5 楼 Saleayas 的回复:FreeLibraryAndExitThread  这个函数其实是 FreeLirary 和 ExitThread 的合体。  当你创建一个线程，在这个线程中是需要使用一个 DLL，那么在线程退出的时候， 你需要清理这个 DLL，那么执行的流程就是 Free and Exit。   但是不能直接呼叫这个两个 API，因为这个代码是在 DLL 中的，那么 Free 之后，返回的位置在 DLL 代码中， 而此时 DLL 已经被卸载，这是就会异常。 而 Windows 提供这个 API 就保证 Free 之后，返回的位置在 系统的 DLL 中（Kernel32.dll.），这样在呼叫 ExitThread 来退出线程。   有几个问题： 1、你所说的是这个线程是在某个DLL中创建的吗？ 之所以这么问，是因为书上说的就是在DLL中创建的线程。 在DLL中创建线程，或者不在DLL中创建线程，与这个问题的讨论有关系吗？