7

我有一个已编译的资源文件 (.res)。我需要用 C# 阅读它,以便我可以通过编程方式对其进行修改。请注意,这不是.resx 文件或 .rc 文件;该文件是编译的,而不是基于文本的。

到目前为止,我尝试查看 Win32 API 中的 LoadLibrary、LoadResource 等,但似乎这些函数仅适用于可执行文件(.exe、.dll),而不适用于资源文件。

我尝试使用BinaryReader加载文件,但当然我无法理解生成的字节数组。我想尝试使用Marshal.PtrToStructure但我不知道 res 文件的结构是什么。我有RESOURCEHEADER的结构,但我不明白如何使用它(我承认我的本地代码经验很少)。

有人可以帮我弄清楚如何成功读取和更新.res 文件中的版本信息吗?

4

1 回答 1

3

很好的问题;我也找不到使用现有功能的好答案。幸运的是,似乎 RES 文件格式比较简单,并记录在这里:

http://msdn.microsoft.com/en-us/library/ms648007(VS.85).aspx

您应该能够扫描版本资源的 RES 文件,然后更新相应的字段。请记住,资源标头是 DWORD 对齐的。

我唯一的其他建议是使用 LoadLibraryEx 并查看是否可以以某种方式将 RES 文件加载为数据文件。但听起来你已经尝试过了。如果你确实成功了,你可能会觉得这个话题很有趣——它是一个如何在两个模块之间复制资源的例子:

http://msdn.microsoft.com/en-us/library/ms648008(VS.85).aspx

我怀疑它会起作用。我在 Dependency Walker 中加载了 RC.EXE,以查看它是否使用任何有趣的 API 来构建 RES 文件。我没有找到,所以我只能假设 RC.EXE 直接写出 RES 文件。

于 2011-11-02T15:02:13.503 回答