Multithreading 使用上下文查询Threads参数

Multithreading 使用上下文查询Threads参数,multithreading,delphi,winapi,memory-management,Multithreading,Delphi,Winapi,Memory Management,我试图通过使用GetThreadContextAPI获取线程的参数指针 以下是一个例子: function TestThread ( p : pointer ) : DWORD; stdcall; begin while true do begin sleep (100); end; end; procedure TForm1.Button1Click(Sender: TObject); var ThreadID : DWORD; ThreadHandle

我试图通过使用
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
不等于我的测试指针)。
我用错了吗?如何使用线程的上下文获取参数?

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

如何使用线程的上下文返回参数

你没有。
上下文
结构不包含该信息

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


碰巧的是,在您的代码中,在我看来,创建挂起的线程实际上不会到达线程过程的最远位置。因此,即使上述方法也不太可能奏效

有什么理由不简单地创建线程、检索参数然后调用自身?这还可以防止由于访问不同步而导致的问题。这似乎没有多大意义。线程被定义为执行单元。如果没有提供有效的代码指针,则没有线程。我想你最好把你要解决的真正问题说出来。不使用您建议的解决方案。此线程将永远不会运行。你正在阅读毫无意义的上下文信息。现在还不清楚你想要完成什么。如果您需要实现IPC,有更合适的方法来实现。为什么您要创建一个(昂贵的)线程对象来将一个指针传递给另一个进程?使用管道、Windows消息、COM封送处理或共享内存段。现在还不清楚你最终想要达到什么目的。@I不确定我已经删除了我所有的评论。我很抱歉。我刚刚解决了问题。在获取线程上下文之前,我忘记将
ContextFlags
设置为
CONTEXT\u FULL
!我应该删除我的答案吗?那没用。您通常不会在
EBX
中找到thread proc参数。您已经在所有版本的Windows上测试过了吗?尝试让线程运行一段时间。使用
EBX
寄存器的某些代码。如果您的代码只能用于创建挂起的线程,那么这样做没有多大意义。假设您实际上对挂起正在运行的线程并检查它感兴趣。如果您只想对创建的挂起线程使用它,那么为什么还要麻烦调用
GetThreadContext
。请记住调用
CreateThread
时传递的值。如果查看我问题的早期版本,我曾经使用RemoteThreads作为单个指针的保持器/虚拟对象。我试图回答面前的问题。我在这里没有看到任何远程线程。我认为你应该在问题中包括基本目标。