首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在64位模式下编译Pascalscript,事件不工作吗?

在64位模式下编译Pascalscript,事件不工作吗?
EN

Stack Overflow用户
提问于 2015-11-11 10:48:56
回答 1查看 322关注 0票数 1

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

我遇到了一个使用表单访问示例脚本与表单进行接口的问题。

它在32位模式下工作,在64位模式下不触发任何事件。

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

我正在使用Delphi 10西雅图在windows 7专业。

对于如何使脚本在64位平台上正确运行,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-23 09:08:57

好吧,既然没有人能回答这个问题,我就得自己做艰苦的工作。

因此,在从delphi到pascalscript方法调用的转换过程中,x64的prolog代码是空的,这是用汇编程序编写的。空方法处理程序在MyAllMethodhandler单元中被称为“uPSruntime”,我的代码解决方案如下所示

代码语言:javascript
复制
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脚本做了广泛的修改,所以它支持复杂的数学。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33648962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档