对 GetFileVersionInfo 参数的理解

对 GetFileVersionInfo 参数的理解

作者:BlogUpdater |  时间:2024-02-05 |  浏览:440 |  评论已关闭 条评论

首先,我们看看官方对 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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。