对 GetFileVersionInfo 参数的理解
首先,我们看看官方对 GetFileVersionInfo 的原型:
它的第三个参数 dwLen 指定了客户方提供的缓冲区 (由第四个参数 lpData 指定)大小,以字节为单位。
真的是这样吗?
微软的应用程序兼容团队发现:有一款流行的游戏开发商对这个 dwLen 参数没有透彻的理解。开发人员将这个参数理解为:我希望加载的版本资源长度,并采用了如下的方式进行调用:
他们是这样想的:”既然 GetFileVersionInfo 想知道文件版本信息的长度,那我们可以调用 GetFileVersionInfoSize 来获取这个长度,完美!”
以上这段代码可以工作,但也只能工作一小会儿。这是为什么?
他们正在检查显卡驱动程序的文件版本。(我的猜测是,他们试图检测特定的显卡驱动程序,以便他们可以解决其中的错误或利用特定于驱动程序的功能) 但是,如果您有一个显卡驱动程序,其版本资源需要超过 1024 字节的空间,则程序会因堆栈损坏而崩溃。
我不知道 Windows Vista 应用程序兼容性人员是否认为值得修复该程序的错误,因为它甚至发生在 Windows XP 上。如果决定这样做,修复将相当简单。一旦检测到程序,在执行加载版本信息的实际工作之前,我们只需要将程序作为 dwLen 传递的值,并根据简单的公式对其进行如下的修改:
dwLen = min(dwLen, 1024);
顺便说一句,正确的代码是这样的,仅供参考:
总结
避免在程序中硬编码,尽量采用动态获取的方式来进行值加载。
你的代码就离艺术品不远了。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The buffer size parameter to GetFileVersionInfo is the size of your buffer, no really》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: 小知识:UAC 对话框的颜色所代表的含义
- 上一篇: 两种相同的垂直工具栏标志以及为什么
相关推荐
- 实战经验:本地yum源制作过程记录
- Posted on 02月27日
- 向Visual Studio Code导入ST项目
- Posted on 09月04日
- 人们不会注意一个程序的内部变化
- Posted on 03月20日
- 字符串资源格式浅谈
- Posted on 11月14日
评论已关闭。