【问题标题】:read FILEVERSION value in code在代码中读取 FILEVERSION 值
【发布时间】:2018-06-06 21:06:49
【问题描述】:

我用 c++ 构建的 dll 有一个 .rc 文件,其中包含:

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,8,7
 PRODUCTVERSION 1,0,8,7

我希望阅读FILEVERSION 值以登录我的代码。 我能怎么做? 我读了一些东西,但是所有的帖子都是相对于读取其他 dll 或 exe 的,我需要读取我当前的 dll

谢谢

【问题讨论】:

  • 读取自己的版本资源比读取其他文件的资源要简单得多。您不会收到文件未找到错误。 GetFileVersionInfo() 需要路径,使用 GetModuleFileName() 获取。您需要的 HMODULE 在 DllMain() 中传递给您。如果您使用宏来创建 .rc 文件,那么您根本不需要它。谷歌“使用宏设置.rc文件版本号”提示。
  • 谢谢,但我不需要设置文件版本,而是阅读它
  • 是的,这很明显。 “根本不需要它”的角度是无需使用 GetFileVersionInfo() 的方式。未编写的代码永远不会失败,也不必维护。
  • @ghiboz 如果您在.h 文件中使用预处理器定义来指定.rc 文件中的版本号,您也可以在.cpp 代码中使用相同的.h 文件,那么您就不需要在运行时动态查询版本号,它们在编译时已经可供您的代码使用。我认为这就是 Hans 所暗示的

标签: c++ visual-studio-2015 fileversioninfo


【解决方案1】:

使用GetFileVersionInfo()VerQueryValue() 是读取任何文件版本数据的安全官方 方式。 DLL 可以通过调用GetModuleFileName() 并为其DllMain() 入口点提供HINSTANCE 来获取自己的路径+文件名。

话虽如此,DLL 直接从自己的版本资源中读取版本数据效率更高,使用(Find|Load|Lock)Resource() 而不是GetFileVersionInfo()。但是,这样做有一些注意事项:

  • 这不是微软官方支持的方法。

  • LockResouce()cannot be passed to VerQueryValue()获取的内存指针。您必须分配资源块的副本,然后您可以将副本传递给VerQueryValue()

  • 但是,您可以安全使用VerQueryValue()已复制资源块中查询的唯一版本数据是根VS_FIXEDFILEINFO结构,即足以获得FileVersionProductVersion 字段。查询任何本地化版本数据都需要通常由 GetFileVersionInfo() 甚至 VerQueryValue() 本身与 GetFileVersionInfo() 协调执行的修复。

StackOverflow上有几个答案解释了如何使用这种方法,其中一些有代码sn-ps,包括:

https://stackoverflow.com/a/48577200/65863

https://stackoverflow.com/a/13942403/65863

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多