我有一个解决方案,主要是C#,但是有一些VC ++项目,这是通过我们的标准发布过程(Unix机器上的perl和bash脚本)推动的。目前,该计划是在DLL和EXE版本通过该过程时验证它们。设置所有版本控制,以便File Version的格式为$Id: $
(冒号和第二个美元之间应该是git commit hash),而产品版本的格式为$Hudson Build: $
(在冒号和第二个美元应该是一个代表哈德森构建细节的字符串。)
目前这个系统对C#项目非常有效,因为这个版本信息在编译代码中存储为普通字符串(你可以直接使用unix strings
命令查看版本信息);问题是VC ++项目不会将这些信息公开为字符串(我已经使用Windows系统验证版本信息是否正确设置),所以我不确定如何在unix系统上提取版本。是否有任何建议A)获取编译代码中嵌入的版本的字符串表示,或B)可以提取此信息的实用程序/脚本?
答案 0 :(得分:1)
假设您的DLL中有一个访问器以获取您需要验证的信息,您可以编写一个在wine下运行的小程序,并将必要的信息输出到标准输出。维基百科上的dynamic link library标题下有一个这样的示例程序。
另一种选择是弄清楚MSVC ++如何编码该信息,以便您可以使用标准的unix工具对其进行解码或查询。
答案 1 :(得分:1)
Windows可执行文件和共享库(DLL)将版本信息编码为VERSIONINFO部分中的二进制数据(resources)。
查看this问题,查看可用于查询版本信息的win32 API。虽然您需要对该代码进行一些小改动。 FindResource和LoadResource API应该在句柄中传递给你想要的版本信息的EXE / DLL(已经加载到内存中)。传入NULL会获取与调用此代码的EXE关联的版本信息(这不是您想要的)。
您需要调用LoadLibrary在磁盘上加载EXE或DLL文件并获取其句柄,然后将此句柄作为hModule参数传递给上述API函数。在获得所需的VERSIONINFO后,也可以将所需信息打印出来。
答案 2 :(得分:1)
Windows上本机编译代码的版本信息以二进制文件形式存储在UTF-16中,即宽字符串。您仍然可以使用strings
命令,但是在使用-e l
选项找到它们之前,您需要告诉它查找宽字符串。
例如,在我的系统上,人民币> C:\ Windows \ notepad.exe上的属性将文件版本设为5.1.2600.5512 (xpsp.080413-2105)
。我把它复制到一个Linux盒子,如你所说,strings
找不到默认标志
$ strings notepad.exe | grep xpsp
$
但是如果你设置了编码就可以了:
$ strings -e l notepad.exe | grep xpsp
5.1.2600.5512 (xpsp.080413-2105)
答案 3 :(得分:0)
您不能简单地使用包含$Id: $
的字符串的任何原因 - 如下所示:
const char version[] = "$Id: $"
当然,您已经在两个地方获得了版本ID,但它们是从同一来源驱动的。