在64位模式下编译Pascalscript,事件不起作用?

时间:2015-11-11 10:48:56

标签: delphi pascalscript

我已下载并开始使用Pascalscript及其示例程序。

我遇到了使用Forms访问示例脚本与Forms连接的问题。

它工作在32位模式,在64位模式下没有事件被触发。

也就是说,按钮onpress事件从不调用pascalscript onpress代码。

我在Windows 7专业版上使用Delphi 10 Seattle。

关于如何让脚本在64位平台上正常工作的任何想法?

1 个答案:

答案 0 :(得分:2)

很明显,没有人能够得到答案,我必须自己做出努力。

所以问题是在从delphi到pascalscript方法调用的转换中x64的空prolog代码是用汇编语言编写的。空方法处理程序被称为" MyAllMethodhandler"在uPSruntime单元中,我的代码解决方案如下

function MyAllMethodsHandler2(Self:PScriptMethodInfo; const Stack:PPointer; _EDX,_ECX:Pointer):Integer; forward;

{$ifdef CPUX64}
procedure MyAllMethodsHandler;
//  On entry:
//  RCX = Self pointer
//  RDX, R8, R9 = param1 .. param3
//  STACK = param4... paramcount
asm
  PUSH  R9
  MOV   R9,R8     // R9:=_ECX
  MOV   R8,RDX    // R8:=_EDX
  MOV   RDX, RSP  // RDX:=Stack
  SUB   RSP, 20h
  CALL MyAllMethodsHandler2
  ADD   RSP, 20h  //Restore stack
  POP   R9
end;
{$else}

procedure MyAllMethodsHandler;   //original x86 code
//  On entry:
//  EAX = Self pointer
//  EDX, ECX = param1 and param2
//  STACK = param3... paramcount
asm
  push 0
  push ecx
  push edx
  mov edx, esp
  add edx, 16 // was 12
  pop ecx
  call MyAllMethodsHandler2
  pop ecx
  mov edx, [esp]
  add esp, eax
  mov [esp], edx
  mov eax, ecx
end;
{$endif}

不确定这是否适用于所有内容,但似乎适用于至少2个参数。

我将它作为对GitHub的评论发布,我无法直接修复它,因为我对整个Pascal脚本进行了大量更改,因此它支持复杂的数学运算。