我已下载并开始使用Pascalscript及其示例程序。
我遇到了使用Forms访问示例脚本与Forms连接的问题。
它工作在32位模式,在64位模式下没有事件被触发。
也就是说,按钮onpress事件从不调用pascalscript onpress代码。
我在Windows 7专业版上使用Delphi 10 Seattle。
关于如何让脚本在64位平台上正常工作的任何想法?
答案 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脚本进行了大量更改,因此它支持复杂的数学运算。