DuplicateHandle函数可以用来复制线程等。
在一个进程中,这个函数可根据位于不同进程内的现有句柄创建一个新句柄。可以从这两个进程中发出对这个函数的调用。进程必须提供PROCESS_DUP_HANDLE访问权限,否则函数执行不能成功
句柄可以重复的对象包括控制台、文件(包括通信设备)、文件映射、事件、可等待计时器、互斥体、管道、进程、注册表项、信号机以及线程
var
Form1: TForm1;
ThreadHandle:THandle;
TargetHandle:THandle;
implementation
{$R *.dfm}
function ThreadFunc(Info:Pointer):Integer;
var
ICounter:Integer;
FormDC:HDC;
begin
FormDC :=GetDC(Form1.Handle);
for ICounter :=1 to 10000 do
TextOut(FormDC,10,50,PChar(IntToStr(ICounter)),Length(IntToStr(ICounter)));
SuspendThread(TargetHandle);
for ICounter :=1 to 10000 do
TextOut(FormDC,110,50,PChar(IntToStr(ICounter)),Length(IntToStr(ICounter)));
ReleaseDC(Form1.Handle,FormDC);
ExitThread(5);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Duplicated:BOOL;
currentProcess:THandle;
CurrentThread:THandle;
ThreadID:Dword;
begin
ThreadHandle :=CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID);
currentProcess :=GetCurrentProcess;
CurrentThread :=GetCurrentThread;
Duplicated :=DuplicateHandle(currentProcess,ThreadHandle,currentProcess,@TargetHandle,0,False,DUPLICATE_SAME_ACCESS);
if not (Duplicated) then
ShowMessage('Duplicated is error!');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ResumeThread(TargetHandle);
end;
end.