关于一个HOOK并使用多线程的问题。
我的线程类
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
HttpStr:string;
HttpLen:DWORD;
socket:integer;
time:Integer;
end;
procedure TMyThread.Execute;
var
i : integer;
begin
inherited;
OnTerminate := Form1.ThreadDone;//保证VCL安全
FreeOnTerminate := true;
HttpData.str:=HttpStr;
HttpData.len:=HttpLen;
HttpData.threadID:=ThreadID;
HttpData.socket:=socket;
HttpData.time:=time;
end;
主线程如下:
HOOK_RECV
function myWSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;
var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
var
ThreadID:DWord;
MyThread:TMyThread;
RecvBuf:array of char;
begin
myWSARecv := oldWSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionROUTINE);
MyThread:=TMyThread.Create(True); //创建线程 且挂起
MyThread.HttpStr:=StrPas(lpBuffers.buf); //获取的数据包给线程
MyThread.HttpLen:=lpNumberOfBytesRecvd; //数据长度
MyThread.socket:=s; //套接字
MyThread.time:=GetTickCount; //线程创建点
MyThread.Resume; //激活线程
end;
子线程结束时调用的VCL输出事件
procedure TForm1.ThreadDone(sender: TObject);
begin
mmo1.Lines.Add('[=================Start=====================]');
mmo1.Lines.Add(Format('线程创建点:[%12d] 输出时间:[%12d] 线程ID:[%8d] SOCKET:[%5d] 数据长度:[%5d]',
[HttpData.time,GetTickCount,HttpData.threadID,HttpData.socket,HttpData.len]));
mmo1.Lines.Add(HttpData.str);
mmo1.Lines.Add('[==================End=====================]');
mmo1.Lines.Add('');
end;
输出结果:
[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4283953] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]
[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4283968] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]
[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4283984] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]
[=================Start=====================]
线程创建点:[ 4283859] 输出时间:[ 4284015] 线程ID:[ 2488] SOCKET:[ 1144] 数据长度:[ 1]
@麶EXjv0梡v<梡vx?
[==================End=====================]
问:1、为什么输出的这4条,结果显示的线程ID、SOCKET、线程创建点都是一样的。
2、如何避免这类问题的出现。