function - 在 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'” 那么如何访问函数调用返回值的属性呢?
请问有什么帮助吗?
解决方案
如果属性访问器方法是 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”(类的实例)传递给该函数。
推荐阅读
- python-3.x - 删除 HTML 原始数据中的所有 CSS FORMAT
- python - 为什么所有的 Nan 值都没有被替换?
- ionic-framework - 在 ionic 5 组件中找不到货币管道错误
- docker - opentilemaps 下载挂起
- java - 如何在已打开活动的操作栏中向片段添加后退按钮?
- python - How do I read images in their sequential order?
- java - 通知不显示在屏幕上并且不存在错误
- android - 当应用程序被杀死时,无法从 FCM onMessageReceived 启动活动
- math - 沿 x 轴均匀分布项目
- sql - 在 SQL 中建模课程表