首页 > 解决方案 > Adobe After Effects SDK 中奇怪的 PF_Handle 声明

问题描述

我正在尝试在我的视频编辑器中托管 After Effects 插件。

在实现一些 Adob​​e 回调时,有一个套件(一组函数指针)分配内存,类型为PF_Handle. 这种类型有一个奇怪的声明 typedef void **PF_Handle;

双指针。我被要求实现的函数指针在此处描述。

PF_Handle (*host_new_handle)(A_HandleSize size);
void (*host_lock_handle)(PF_Handle pf_handle);
void (*host_unlock_handle)(PF_Handle pf_handle);
void (*host_dispose_handle)(PF_Handle pf_handle);

如果 PF_Handle 是一个普通的 void* 就没有什么奇怪的了,我只需调用new/delete并转换指针。实际上,我正在调试的同一个插件的代码采用该指针,锁定它并直接使用它。但后来在同一个插件中,我看到这样的代码:

`return *(PF_Pixel**)m_bufH;`

m_bufH 是 PF_Handle,它是通过调用host_new_handle. 这意味着插件需要一个双指针。没有调用锁定函数并且插件尝试访问双指针数据,当然失败了。

可能是什么问题?

这里会发生什么?锁定和解锁双指针是什么意思?

标签: c++adobeafter-effects

解决方案


句柄指向可移动存储器。内存可能会被内存管理器移动,从而使您拥有的指针无效。为了创建句柄,请使用内存管理器提供的 API——否则管理器将不知道如何移动分配的内存。锁定手柄可防止内存被使用,并为您提供一个指针,您可以在手柄锁定时使用。您不应该将句柄锁定的时间超过访问内存所必需的时间,否则您会违背内存管理器的目的,导致资源耗尽和其他问题。在编译器不对其进行优化的情况下,可以通过双重取消引用访问未锁定的句柄。而且它比锁定慢,除非你只做一件简单的事情。


推荐阅读