如何从BPL文件中提取资源?

4

如果我有一个嵌入在EXE中的资源,想要提取它,那么这很简单。可以使用以下代码:

stream := TResourceStream.Create(HInstance, ResourceName, RT_RCDATA);

这个方法有效是因为全局变量HInstance是EXE的句柄。在BPL内部,是否有类似的方式可以获取其所属的包的句柄,以便从中提取资源?

1个回答

7

HInstance实际上在SysInit单元中,对于每个PE(包、exe、dll)是唯一的。如果使用rtl包,则编译器RTL和辅助函数的主要部分System是共享的。

因此,您上面显示的代码应该可以在包内正常工作。MainInstance可能是您认为是指向加载exe(甚至在某些情况下是DLL)的句柄的东西。


是的,SysInit.HInstance 是执行代码所在模块的实例。 - David Heffernan
理论上来说很好,但实际上并不起作用。我在一个BPL单元中有一行代码,它会引发一个未找到的错误。我使用ResourceHacker验证了资源是否存在,并且名称正确。你有什么想法? - Mason Wheeler
刚刚测试了一下,BPL 中的单元的 HInstance 值与托管 BPL 的 EXE 中的单元返回的值完全相同。 - Mason Wheeler
确保您没有在其他共享单元中定义名为HInstance的全局变量。您也可以使用SysInit.HInstance来限定标识符,以确保获取正确的变量。 - Allen Bauer
不是的。SysInit.HInstance 返回相同的值。令人奇怪的是,FindHInstance(@ThisProc)FindClassHInstance(TFormInThisBPL) 也是如此。 - Mason Wheeler
1
这可能意味着你的单元被编译到了主可执行文件中。 - Ondrej Kelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接