Delphi 11.3 Alexandria中SvCom服务Win64平台无法启动求助
解决Delphi 11.3 64位下SvCom服务SetServiceStatus无效问题
问题根源
你的64位汇编代码未正确遵循Delphi 11.3的x64调用约定,栈帧处理存在疏漏。32位环境与旧版本Delphi能正常运行,是因为它们的栈帧管理规则和11.3的x64环境不兼容,导致服务状态设置时上下文出错,触发句柄无效的错误。
修复方案
修改SvSetservicestatus函数的x64汇编部分,补充栈帧维护逻辑,确保符合Delphi 11.3的x64规范:
const PSvSetServiceStatus: Pointer = nil; function SvSetservicestatus; asm call InitNTServiceDebug {$IFDEF CPUX64} // 64位环境下正确维护栈帧 push rbp mov rbp, rsp Mov rax, qword PTR [PSvSetServiceStatus] test rax,rax Jz @SetServicestatus // 跳转前恢复栈帧 pop rbp Jmp qword Ptr [PSvSetServiceStatus] @SetServicestatus: pop rbp {$ELSE} Pop EBP Cmp DWORD Ptr [PSvSetServiceStatus],$00 JZ SetserviceStatus jmp DWORD Ptr [PSvSetServiceStatus] {$ENDIF} end;
验证步骤
- 清理旧的64位服务注册记录
- 重新编译修改后的代码为64位目标平台
- 注册服务并启动,或使用DEBUG参数在SvCom窗口测试
内容的提问来源于stack exchange,提问作者Federico Pessina
相关产品推荐
相关产品推荐

