使用Context查询线程参数

时间:2014-02-03 13:17:02

标签: multithreading delphi winapi memory-management

我正在尝试使用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获取参数?

1 个答案:

答案 0 :(得分:1)

根本没有理由期望线程的EBX寄存器将包含传递给线程过程的参数。 EBX寄存器是一个通用寄存器,它将包含最后放入该寄存器的线程,以执行它正在执行的任何操作。

  

如何使用Thread的上下文获取参数?

你没有。 <{1}}结构不包含该信息。

您可能会找到与CONTEXT调用相关联的堆栈帧。只要线程没有覆盖用于传递参数的堆栈部分,它就会包含您感兴趣的值。

碰巧在我的代码中,在我看来,创建挂起的线程实际上并没有使它成为线程过程。因此,即使上述方法也不太可行。