我写了一个测试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?
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?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货