我已经下载并开始使用Pascalscript及其示例程序。
我遇到了一个使用表单访问示例脚本与表单进行接口的问题。
它在32位模式下工作,在64位模式下不触发任何事件。
也就是说,按钮按下事件从不调用pascalscript onpress代码。
我正在使用Delphi 10西雅图在windows 7专业。
对于如何使脚本在64位平台上正确运行,有什么想法吗?
发布于 2015-11-23 09:08:57
好吧,既然没有人能回答这个问题,我就得自己做艰苦的工作。
因此,在从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脚本做了广泛的修改,所以它支持复杂的数学。
https://stackoverflow.com/questions/33648962
复制相似问题