我正在尝试使用GetThreadContext
API获取线程的参数指针。
以下是一个例子:
function TestThread ( p : pointer ) : DWORD; stdcall;
begin
while true do begin
sleep (100);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID : DWORD;
ThreadHandle : THandle;
Test : DWORD;
ThreadContext : TContext;
begin
Test := 1337; // Just for testing...
ThreadHandle := CreateThread(NIL, 0, @TestThread, Pointer(Test), CREATE_SUSPENDED, ThreadID);
if ThreadHandle > 0 then begin
if GetThreadContext(ThreadHandle, ThreadContext) then begin
if ThreadContext.Ebx = Test then begin // This should match!
Messagebox (0, 'Match!', '', 0);
end else begin
MessageBox(0, 'No Match!', '', 0);
end;
end;
TerminateThread(ThreadHandle,0);
CloseHandle(ThreadHandle); // Not sure if needed...
end;
end;
似乎这不起作用(ThreadContext.Ebx
不等于我的TestPointer)。
我用错了吗?如何使用Thread的Context获取参数?
答案 0 :(得分:1)
根本没有理由期望线程的EBX
寄存器将包含传递给线程过程的参数。 EBX
寄存器是一个通用寄存器,它将包含最后放入该寄存器的线程,以执行它正在执行的任何操作。
如何使用Thread的上下文获取参数?
你没有。 <{1}}结构不包含该信息。
您可能会找到与CONTEXT
调用相关联的堆栈帧。只要线程没有覆盖用于传递参数的堆栈部分,它就会包含您感兴趣的值。
碰巧在我的代码中,在我看来,创建挂起的线程实际上并没有使它成为线程过程。因此,即使上述方法也不太可行。