在 64 位模式下编译 Pascalscript,事件不起作用?
Compiling Pascalscript in 64 bit mode, events not working?
我已经下载并开始使用 Pascalscript 及其示例程序。
我在使用 Forms 访问示例脚本连接到 Forms 时遇到了问题。
它在 32 位模式下工作,在 64 位模式下不会触发任何事件。
也就是说,按钮 onpress 事件从不调用 pascalscript onpress 代码。
我在 windows 7 pro 上使用 Delphi 10 Seattle。
关于如何让脚本在 64 位平台上正常工作有什么想法吗?
好吧,既然没有人回答这个问题,我必须自己做这项艰苦的工作。
所以问题是在从 delphi 到用汇编程序编写的 pascalscript 方法调用的转换中,x64 的空序言代码。在uPSruntime单元中调用了空方法处理程序"MyAllMethodhandler",我的代码解决方案如下
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 个参数。
我将 post 作为对 GitHub 的评论,我无法直接修复它,因为我对整个 Pascal 脚本进行了大量更改,因此它支持复杂的数学运算。
我已经下载并开始使用 Pascalscript 及其示例程序。
我在使用 Forms 访问示例脚本连接到 Forms 时遇到了问题。
它在 32 位模式下工作,在 64 位模式下不会触发任何事件。
也就是说,按钮 onpress 事件从不调用 pascalscript onpress 代码。
我在 windows 7 pro 上使用 Delphi 10 Seattle。
关于如何让脚本在 64 位平台上正常工作有什么想法吗?
好吧,既然没有人回答这个问题,我必须自己做这项艰苦的工作。
所以问题是在从 delphi 到用汇编程序编写的 pascalscript 方法调用的转换中,x64 的空序言代码。在uPSruntime单元中调用了空方法处理程序"MyAllMethodhandler",我的代码解决方案如下
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 个参数。
我将 post 作为对 GitHub 的评论,我无法直接修复它,因为我对整个 Pascal 脚本进行了大量更改,因此它支持复杂的数学运算。