2017-09-04 97 views
0

我在使用资源文件的每个教程/书籍中都感到沮丧,但从来没有解释他们为什么使用它们或者他们如何在引擎盖下工作。我无法在这方面找到任何信息。我希望有人可以为每个人创建一个公开的答案,以便稍后查找。Windows中的资源文件如何工作以及为什么使用它们?

一些相关的信息可能包括...

  1. 什么是背后的资源文件的原理是什么?

  2. 它们是功能还是Windows或语言编译器?

  3. 为什么你不应该只通过代码创建一个GUI?

  4. 是否存在只能使用资源文件或只能使用代码的情况?

  5. 资源文件条目如何在运行时转换为实际窗口对象?

  6. 资源编译器对这些条目做了什么以及编译后的格式包含了什么?

  7. 使用资源文件而不是代码创建的加载时间有所不同吗?

  8. 您对使用资源或代码有什么建议?

任何额外的信息,将不胜感激。

回答

0

传统上在Windows开发中,资源文件直接嵌入到可执行二进制文件中。我不认为这种资源的特定方法在Windows之外使用得非常多,但是Java通过将资源和可执行位一起存储在压缩存档中来实现跨平台的方式。您可以在Android开发中看到同样的情况,资源嵌入到APK文件中。这很常见(除了在Windows二进制文件中)使用XML来指定资源。将资源打包到可执行文件中有潜在的优势:提供“单文件解决方案”;该可执行文件包含应用程序逻辑和支持资源,并将其全部捆绑到一个文件中。这在某些情况下可能会有所帮助,但找到可作为单个文件分发的实质应用程序非常罕见。无论如何,这种打包资源的方法可以追溯到Windows开发的早期阶段;微软可能借鉴了当时其他桌面微型平台常见的方法,我想所有这些方法现在都已经过时了。

资源允许某些东西 - 通常是用户界面元素 - 以声明方式指定,而不是在代码中指定。一个很好的功能是允许这些声明性元素与语言环境相关。因此,例如,我们可以为英文指定一个主菜单,为法文指定一个主菜单,等等,并在运行时选取适当的一个。

让图形设计工具编写和编辑声明性资源文件比代码更容易,但直接输出代码并非不可能。无论如何,通常认为将用户界面元素与应用程序逻辑分开是“更好的”。通过仔细的设计,用户界面位和其他资源可以在应用程序本身完成后进行编辑,并且可以单独维护。

经典的Windows资源被资源编译器编译成压缩的二进制格式,以该格式戳入对象(.obj,.o)文件,然后通过链接器链接到可执行文件中。我怀疑用现代开发工具,所有这些东西都是完全隐藏的,而且你只能看到最终的可执行文件。 Windows API知道如何从可执行文件中解压缩资源,并将它们转化为程序化表示 - 不是代码,而是代码,但是可以由其他API调用使用的内存中的数据。

根据我的经验,虽然处理基于XML的资源可能会稍微慢一点,但Windows(二进制)资源不会有任何明显的开销超过显式编码。

编码用户界面通常比使用资源提供更大的灵活性;在同一个应用程序中使用这两种方法并不罕见。

+0

这很有道理。所以据我的理解,如果我在RC文件中写入类似“101 icon.ico”的东西,icon.ico数据将被编译到二进制文件中,当我调用LoadIcon(...,101)时,窗口会使用该数据创建并返回一个Icon对象给我?我假设这些对象是按需加载的,而不是在启动时立即全部加载。这似乎相当合理和有用。 –

+0

我的回忆是,可执行文件的相关部分 - 包含资源的部分 - 实际上映射到内存中。因此,读取资源在加载可执行文件后根本不是文件操作,而是内存操作。我相信图标和菜单在内存中具有几乎完全映射到编译资源文件内容的数据结构,因此映射到内存中的数据几乎可以按照原样使用。不过,这在Windows版本中可能会有所不同。 –

相关问题