代码之家  ›  专栏  ›  技术社区  ›  Guildencrantz

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

  •  2
  • Guildencrantz  · 技术社区  · 15 年前

    我有一个解决方案,主要是C,但有几个VC++项目,它们是通过我们的标准发布过程(Unix机器上的Perl和Bash脚本)推送的。目前的计划是在DLL和EXE版本通过过程时对它们进行验证。所有版本控制都被设置为文件版本的格式 $Id: $ (冒号和第二美元之间应该是git commit散列),产品版本的格式为 $Hudson Build: $ (在冒号和第二个美元之间应该是一个表示哈德逊构建细节的字符串)。

    目前,这个系统对于C项目非常有效,因为这个版本信息在编译后的代码中以普通字符串的形式存储(您可以直接使用Unix strings 命令并查看版本信息);问题是VC++项目不会将此信息作为字符串公开(我已使用Windows系统验证是否正确设置了版本信息),因此我不确定如何在UNIX系统上提取版本。对于a)获取嵌入在编译代码中的版本的字符串表示,或b)可以提取此信息的实用程序/脚本,有什么建议吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Andy Mortimer    15 年前

    Windows上本机编译的代码的版本信息以utf-16(即宽字符串)的二进制形式存储。你仍然可以使用 strings 命令,但您需要告诉它在找到宽字符串之前查找宽字符串,使用 -e l 选择权。

    例如,在我的系统上,C:\windows\notepad.exe上的RMB>属性将文件版本设置为 5.1.2600.5512 (xpsp.080413-2105) . 我把它复制到一个Linux设备上,就像你说的, 找不到带有默认标志的

    $ strings notepad.exe | grep xpsp
    $
    

    但是,如果设置了编码,结果会很好:

    $ strings -e l notepad.exe | grep xpsp
    5.1.2600.5512 (xpsp.080413-2105)
    
        2
  •  1
  •   Kaleb Pederson    15 年前

    假设您的DLL中有一个访问器来获取需要验证的信息,那么您可以编写一个运行在 wine 并将必要的信息输出到标准输出。在 dynamic link library 维基百科的标题。

    另一个选项是找出MSVC++是如何编码这些信息的,以便您可以使用标准的Unix工具对其进行解码或查询。

        3
  •  1
  •   Community CDub    8 年前

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

    看一看 this 查看可用于查询版本信息的Win32 API的问题。尽管您需要对代码做一个小的更改。这个 FindResource LoadResource API应该在句柄中传递给您想要其版本信息的exe/dll(已加载到内存中)。传入空值将获取与从中调用此代码的exe相关联的版本信息(这不是您想要的)。

    你需要打电话 LoadLibrary 要在磁盘上加载一个exe或dll文件并获取其句柄,请将此句柄作为hmodule参数传递给上述API函数。也可以在获得所需版本信息后将所需信息打印到控制台。

        4
  •  0
  •   Eric Brown    15 年前

    为什么不能简单地使用包含 $Id: $ -像这样:

    const char version[] = "$Id: $"
    

    当然,您在两个地方都有版本ID,但它们是从同一个源驱动的。