【问题标题】:How to extract a resource from within a BPL?如何从 BPL 中提取资源?
【发布时间】:2011-03-21 14:02:21
【问题描述】:

如果我有一个 EXE 中的资源并且我想提取它,这非常简单。比如:

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

这是因为全局变量 HInstance 是 EXE 的句柄。 BPL 中的代码是否有任何类似的方法来获取它所属的包的句柄,以便我可以从中提取资源?

【问题讨论】:

    标签: delphi resources packages bpl


    【解决方案1】:

    HInstance 实际上是在每个 PE(包、exe、dll)唯一的 SysInit 单元中。系统,如果使用 rtl 包,大部分编译器 RTL 和辅助函数在包之间共享。

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

    【讨论】:

    • 是的,SysInit.HInstance 是执行代码所在模块的实例。
    • 嗯,理论上这很好,但它不起作用。我在 BPL 中有一个带有这样一行的单元,它引发了一个未找到的错误。我已经使用 ResourceHacker 来验证资源是否存在,并且名称正确。知道发生了什么吗?
    • 刚刚对其进行了测试以确定,来自 BPL 中的单元的 HInstance 值与从托管 BPL 的 EXE 中的单元返回的值相同。
    • 确保在其他共享单元中没有名为 HInstance 的全局变量。您还可以使用 SysInit.HInstance 限定身份,以确保您获得正确的身份。
    • 这可能意味着你的单元被编译成主可执行文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2013-01-16
    相关资源
    最近更新 更多