看了 Windows 的 DLL 保存字符串资源代码,再次惊掉我下巴。

2021-05-29 02:26:48 +08:00
3dwelcome  3dwelcome

以 Visual Studio 2017 举例,主界面上不同语言翻译文件,是保存在 IDE{LANGID}\msenvmui.dll 下面,可以用资源编辑器打开,截图这样:

有 ID 和对应的字符串,我这时候猜测,资源里就是一个表格文本,读取和翻译应该很容易。

然后花一小时读了源代码,最后发现完全不是自己想的这样。


在 msenvmui.dll 里,一共有 82 个有效字符串,中间穿插了一百多个空字符串。

[正常 string] [空 string] [空 string] [正常 string], 就是这种文件布局,空 string 都是实际占空间的(两个字节)。

为什么空呢,因为微软对 ID 字符串用的是二分法查找。查询键值是纯数字 ID,比如 1 到 100,就算中间一大片都没有 ID 对应的字符串,也需要占位符给填满,所谓有序排序。

微软可真是个小机灵鬼。

3749 次点击
所在节点   Windows  Windows
21 条回复
3dwelcome
3dwelcome
2021-05-30 23:50:32 +08:00
@wangxn "二分搜索需要元素的大小是固定的", 你说的大小固定是指值吧。二分算法只能对纯数字做快速查找,我说的肯定不是对变长字符串直接查找。

类似结构 [字符串 resourceid][字符串偏移] [字符串 resourceid][字符串偏移] [字符串 resourceid][字符串偏移] ...

其中 resourceid 是可以二分的数值,已经排序过了。可以直接查找,找到后,再从偏移地址读取字符串具体文字内容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/779947

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX