D7:在使用 asm 32 位 stdcall 调用 proc 后读取可变参数

D7: Read var-arguments after call proc with asm 32-bit stdcall

您好,使用下面的代码通过 asm 调用一个函数,并在调用后读取结果。那很好用。现在,- 之后如何阅读参数变化,最好的问候

//push arguments:
  for i:=lst.cnt downto 0 do begin //reverse order
   ia:=longword(lst.fList^[i]);
   asm push ia end;   //push 32-Bit argument
  end;
  asm
   call proc     //call the routine
   mov ia, eax   //get result right after the call
  end;
//how to read variable arguments here ?

编辑:

初始代码 运行 有一段时间没有任何问题,即使在使用循环时也是如此。这个问题的原因来了,当我不得不像这样调用一个 winapi 例程时:

function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; stdcall;
external user32 name 'GetWindowRect';

它声明了一个变量记录参数"lpRect"(大小:16 字节)。我试图在通话前(推送)这 4 个整数,然后在通话后读取它们。结果 只是将指针 传递给在这种情况下实际工作的数据。

结论:所以不存在变量参数,只有指向值或记录的指针。感谢任何有助于得出这个结论的意见

如果按值传递参数,则 list.fList^[i] 包含指向该值的指针。

只需取消引用并使用它,例如 PInteger(list.fList^[i])^ 用于通过引用传递的整数参数(如 var)。

但是请注意,您的代码非常糟糕,在循环中使用 push 是非常危险的。它还需要遵循调用约定——使用默认 Delphi 寄存器定义的 proc 函数将其第一个参数传递给 eax/ecx/edx。检查 this reference material - 你的问题似乎表明你对它的工作原理有点困惑。