WinMD、C++/WinRT 与对象生命周期#
元数据提供 ABI 线索#
实现闭源时,WinMD 仍可能暴露接口 ID、方法顺序、签名和枚举。推导候选虚表位置时计入继承接口槽位,核对 HRESULT、输出参数、指针宽度、值布局和 HSTRING 转换;候选槽位不是已证明调用。
元数据未覆盖的实现细节使用定点原生分析。分别记录元数据、反汇编与运行观察提供的事实。全模块反编译超时不否定已经验证的元数据路线;元数据解析成功也不等于完整反编译。
获取真实对象#
通过真实运行时取得操作需要的组件或服务对象。区分激活工厂与实例、资源访问对象与任意 ID 字符串;不伪造访问令牌,不把过期指针当作持久标识。只有操作实际使用应用、编辑器或项目对象时,才需要获取这些对象。
每个接口指针记录借用/持有状态、应做的释放、使其失效的生命周期变化。临时包装也可能影响引用计数;不能盲目释放借用指针,也不能永久保留所有对象。
委托对象和原生回调的实现必须保持有效,直到应用不再使用。异步提交后宿主退出可能留下悬空回调。关闭会话应等待挂起回调,并按观察到的顺序释放。
调度与编辑模式#
确定每个接口的 apartment 与线程要求。线程绑定对象使用所属调度器,跨 apartment 访问采用运行时支持的封送机制。不要阻塞调度器等待仍需该调度器处理的完成任务。记录每项调用需要的应用状态。
参数可能同时有数值存储与表达式两种表示。记录基础单位并在表达式里显式带单位,不从界面语言猜测。参数显示名称可能本地化,需要先发现;身份尽量采用稳定 ID。
恢复生命周期转换#
追踪应用调用方,恢复合法状态及转换顺序。每次转换记录前置条件、异步完成信号、新获取对象及失效句柄,明确建模挂起和失败状态。
不同服务可能分别维护活动上下文。操作依赖它们一致时,在转换后查询各自身份。从对象所有者重新获取接口,不跨越未经验证的生命周期边界复用指针。
通过有限实验研究依赖。多项修改共同构成可用顺序时,保存完整支持顺序及证据,直到能够独立确认各项依赖。
打包应用的边界#
Python 可访问的路径不一定对打包应用可见。检查合法的应用暂存目录、记录实际解析位置,导出后按字节/哈希校验复制。不要把外部重新渲染标为原生输出。
记录操作所需的包身份、激活状态与能力,在应用自身上下文中定位访问失败,不根据控制进程的权限推断应用权限。
验证接口结果#
分别检查 HRESULT 或异常通道、输出参数初始化、异步终态和原生结果。ABI 调用成功可能只表示已经提交任务。
验证返回对象在声明寿命内可用,并在声明边界失效。持久化或导出结果按操作的数据模型及输出格式设计检查。