我写了一个测试dll:
library MinMax;uses
  SysUtils,
  Classes,
  Windows;var
   SaveExit : pointer ;
   str : string='';function Min(X, Y: Integer): Integer; stdcall;begin
  if X < Y then Min := X else Min := Y;
end;function Max(X, Y: Integer): Integer; stdcall;begin
  if X > Y then Max := X else Max := Y;
end;
exports  Min,
  Max;procedure writeerr(ErrorMsg:string);
var
  LogFile : THANDLE;
  hTemplateFile : THANDLE;
  lpNumberOfBytesWritten : integer;
  str : array[1..500] of char;
begin
  StrCopy(PChar(@(str[1])),PChar(ErrorMsg));
  try
    LogFile := CreateFile('d:\MaxMin.log',
                           GENERIC_WRITE,
                           FILE_SHARE_WRITE,
                           nil,
                           OPEN_ALWAYS,
                           FILE_ATTRIBUTE_NORMAL,
                           hTemplateFile);
    SetEndOfFile(LogFile);
    WriteFile(LogFile,
              str,
              StrLen(PChar(@str[1])),
              lpNumberOfBytesWritten,
              nil);  finally
    Closehandle(LogFile);
  end;end;procedure AddStr( ErrorMsg:string );
begin
  str := str + ErrorMsg + #10#13;
end;procedure LibExit( Reason: Integer) ;
begin
   if Reason=DLL_PROCESS_ATTACH then
   begin
     //writeerr('DLL_PROCESS_ATTACH');
   end;
   if Reason=DLL_THREAD_ATTACH then
   begin
     AddStr('DLL_THREAD_ATTACH');
   end;
   if Reason=DLL_THREAD_DETACH then
   begin
     AddStr('DLL_THREAD_DETACH');
   end;
   If Reason=DLL_PROCESS_DETACH then
   Begin
      AddStr('DLL_PROCESS_DETACH');
      writeerr(str);
      DllProc := SaveExit ;
   End;
end;
begin
   str := '';
   SaveExit := DllProc ;
   DllProc  := @LibExit ;
end.测试程序用Loadlibrary加载该动态连接库,然后再启动两个线程,最后生成的文件内容是:
DLL_THREAD_ATTACHDLL_THREAD_ATTACHDLL_THREAD_ATTACHDLL_THREAD_ATTACHDLL_THREAD_DETACHDLL_THREAD_DETACHDLL_PROCESS_DETACH我不明白为什么有四个DLL_THREAD_ATTACH?