首页 > 解决方案 > 在 Delphi 中,如何从 asm 语句中调用私有属性读取函数

问题描述

这行 Pascal 代码:

gh := GCanvas.Handle

(其中 GCanvas 是 TCanvas 类型的变量)

用汇编语言转换成这个(在 CPU 窗口中查看):

mov eax,[GCanvas]
call TCanvas.GetHandle
mov [gh],eax

GetHandle 是返回 Graphics.pas 中定义的 FHandle 值的私有函数

如何访问 asm 语句中的 TCanvas Handle 属性?我尝试了上述调用,但编译器返回“未声明的标识符'GetHandle'” 那么如何访问函数调用返回值的属性呢?

请问有什么帮助吗?

标签: functiondelphiassemblyproperties

解决方案


如果属性访问器方法是 PRIVATE,那么简单的答案是:你不能。编译器根本不知道代码中的那个符号。即使来自 Pascal,你也不能,除非通过 RTTI,这可能太麻烦而无法从汇编中完成。

这样做的方法是提供一个调用该属性的“网关”函数(它又调用私有函数):

FUNCTION GetHandle(C : TCanvas) : HDC; Register;  // Must be a Global function //
  BEGIN
    Result:=C.Handle
  END;

然后从您的汇编代码中:

VAR GCanvas : TCanvas;
VAR gh : THandle;

ASM
        MOV     EAX,GCanvas
        CALL    GetHandle
        MOV     [gh],EAX
END

如果将 GetHandle 函数设为类的方法,则还需要将 EDX 中的“Self”(类的实例)传递给该函数。


推荐阅读