假如我先调用FreeLibrary,再调用ExitThread;这个ExitThread到底是结束DLL内部的线程还是结束应用程序的当前线程,如果是结束当前应用程序的线程,我觉得调用ExitThread不会出错啊,我不明白,请各位朋友指点啊

解决方案 »

  1.   

    form <windows核心编程>为什么Microsoft要创建FreeLibraryAndExitThread这个函数。其原因与下面的情况有关:假定你要编写一个DLL,当它被初次映射到进程的地址空间中时,该DLL就创建一个线程。当该线程完成它的操作时,它通过调用FreeLibrary函数,从进程的地址空间中卸载该DLL,并且终止运行,然后立即调用ExitThread。但是,如果线程分开调用FreeLibrary和ExitThread,就会出现一个严重的问题。这个问题是调用FreeLibrary会立即从进程的地址空间中卸载DLL。当调用的FreeLibrary返回时,包含对ExitThread调用的代码就不再可以使用,因此线程将无法执行任何代码。这将导致访问违规,同时整个进程终止运行。但是,如果线程调用FreeLibraryAndExitThread,该函数调用FreeLibrary,使DLL立即被卸载。下一个执行的指令是在Kernel32.dll中,而不是在刚刚被卸载的DLL中。这意味着该线程能够继续执行,并且可以调用ExitThread。ExitThread使该线程终止运行并且不返回。
      

  2.   

    WINDOWS核心编程我看过,我还是不明白,FreeLibrary是在进程内部调用啊,而不是在DLL内部自己调?"假定你要编写一个DLL,当它被初次映射到进程的地址空间中时,该DLL就创建一个线程"为什么会创建线程呢,我不明白啊
      

  3.   

    晕,其实是书翻译的不好.事实是这样的:加载DLL->这个DLL创建一个新线程->新线程完成工作->新线程里调用FreeLibrary(...)->新线程里再调用ExitThread(...)注意,当调用ExitThread时候会失败,因为这个线程是在DLL里创建的,所以线程函数也在DLL里,所以这个ExitThread(...)也在DLL里,当DLL被卸载了之后,虽然这个线程是属于当前进程的而不是DLL的,但是还是调用了DLL里的ExitThread(...),操作当然是违法的.
      

  4.   

    int WINAPI DllMain(...)
    {
       ....//
       case DLL_PROCESS_ATTACH           //加载DLL的时候新建个线程
           HANDLE handle=CreateThread(...);
           ...
           CloseHandle(handle);
           break;
       ....//
    }