如何在Unix系统上验证Windows VC ++ DLL

时间:2010-05-28 17:45:58

标签: c# unix visual-c++ deployment versioning

我有一个解决方案,主要是C#,但是有一些VC ++项目,这是通过我们的标准发布过程(Unix机器上的perl和bash脚本)推动的。目前,该计划是在DLL和EXE版本通过该过程时验证它们。设置所有版本控制,以便File Version的格式为$Id: $(冒号和第二个美元之间应该是git commit hash),而产品版本的格式为$Hudson Build: $(在冒号和第二个美元应该是一个代表哈德森构建细节的字符串。)

目前这个系统对C#项目非常有效,因为这个版本信息在编译代码中存储为普通字符串(你可以直接使用unix strings命令查看版本信息);问题是VC ++项目不会将这些信息公开为字符串(我已经使用Windows系统验证版本信息是否正确设置),所以我不确定如何在unix系统上提取版本。是否有任何建议A)获取编译代码中嵌入的版本的字符串表示,或B)可以提取此信息的实用程序/脚本?

4 个答案:

答案 0 :(得分:1)

假设您的DLL中有一个访问器以获取您需要验证的信息,您可以编写一个在wine下运行的小程序,并将必要的信息输出到标准输出。维基百科上的dynamic link library标题下有一个这样的示例程序。

另一种选择是弄清楚MSVC ++如何编码该信息,以便您可以使用标准的unix工具对其进行解码或查询。

答案 1 :(得分:1)

Windows可执行文件和共享库(DLL)将版本信息编码为VERSIONINFO部分中的二进制数据(resources)。

查看this问题,查看可用于查询版本信息的win32 API。虽然您需要对该代码进行一些小改动。 FindResourceLoadResource 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,但它们是从同一来源驱动的。