当前位置:  开发笔记 > 编程语言 > 正文

命令行工具转储Windows DLL版本?

如何解决《命令行工具转储WindowsDLL版本?》经验,为你挑选了6个好方法。

我需要一个命令行工具来转储标准的Windows DLL版本信息,以便我可以通过bash脚本(Cygwin)处理它.

作为一名Java开发人员,我不太熟悉Microsoft开发工具(尽管我对Microsoft Visual Embedded C++ 4.0和Microsoft Visual Basic 6.0有一点经验).

适当的工具似乎是mt.exe,如SO所述.但是,我发现获得这个小应用程序的唯一机会是下载适用于Windows Server 2008和.NET Framework的Windows SDK的1.29 GB ISO .我无法相信这是唯一的方法.

我还在Internet上发现了一个名为PEView的小应用程序,但它显示的信息太多(在我的情况下无用)信息,它不是命令行应用程序.

捆绑在Cygwin中的标准objdump也可以转储有关DLL文件的一些信息,但我看不到转储DLL版本的选项.请注意,此工具(使用-p选项)转储的MajorImageVersion,MinorImageVersion和其他字段与自己的DLL版本无关.

关于该怎么做的任何替代方案?也许我错过了一些重要的objdump选项?mt.exe是我唯一的选择吗?如果是这种情况,是否可以将其与Windows SDK分开?



1> Graham Ambro..:

您可以使用PowerShell获取所需的信息.

(Get-Item C:\Path\To\MyFile.dll).VersionInfo

默认情况下,这将显示ProductVersion和FileVersion但是可以使用完整的VERSIONINFO.即返回评论

(Get-Item C:\Path\To\MyFile.dll).VersionInfo.Comments


管道到fl*以获取所有VersionInfo属性:PS C:\>(Get-Item C:\ Windows\System32\WindowsPowerShell\v1.0\powershell.exe).VersionInfo | fl*
这应该是答案.这是唯一不依赖开箱即用工具的答案.
从正常的批处理文件:`powershell -command(Get-Item C:\ Path\To\MyFile.dll).VersionInfo`

2> Alessandro J..:

使用Microsoft Sysinternals Sigcheck.此示例仅输出版本:

sigcheck -q -n foo.dll

解压缩的sigcheck.exe仅为228 KB.


五年后349 KB ......还值得吗?;)

3> Patrick Cuff..:

您可以编写VBScript脚本来获取文件版本信息:

VersionInfo.vbs

set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
WScript.Echo fso.GetFileVersion(args(0))
Wscript.Quit

你可以从命令行调用它,如下所示:

cscript //nologo VersionInfo.vbs C:\Path\To\MyFile.dll



4> bdimych..:
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version
Version
6.1.7601.18229



5> gbjbaanb..:

或者你可以自己建造一个.打开VS,创建一个新的控制台应用程序.创建一个没有ATL或MFC支持的简单项目,保持选中stdafx选项但不检查'empty project'并将其命名为VersionInfo.

您将获得一个包含2个文件的简单项目:VersionInfo.cpp和VersionInfo.h

打开cpp文件并将以下内容粘贴到其中,然后进行编译.你将能够运行它,第一个参数是完整的文件名,它将根据Version资源块打印出"Product:5.6.7.8 File:1.2.3.4".如果没有版本资源,它将返回-1,否则返回0.

使用dll CRT编译为8k二进制文件,使用静态链接的所有内容编译为60k(在C++选项中设置,将"代码生成页面,运行时选项"更改为"/ MT")

HTH.

PS.如果您不想使用Visual Studio,它仍然可以使用任何c ++编译器进行编译(手指交叉),但您几乎肯定必须更改#pragma - 只需在链接器设置中指定lib,pragma的只是一个自动链接到该库的简写.


// VersionInfo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include 

#pragma comment(lib, "version.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD handle = 0;
    DWORD size = GetFileVersionInfoSize(argv[1], &handle);
    BYTE* versionInfo = new BYTE[size];
    if (!GetFileVersionInfo(argv[1], handle, size, versionInfo))
    {
        delete[] versionInfo;
        return -1;
    }
    // we have version information
    UINT    len = 0;
    VS_FIXEDFILEINFO*   vsfi = NULL;
    VerQueryValue(versionInfo, L"\\", (void**)&vsfi, &len);

    WORD fVersion[4], pVersion[4];
    fVersion[0] = HIWORD(vsfi->dwFileVersionMS);
    fVersion[1] = LOWORD(vsfi->dwFileVersionMS);
    fVersion[2] = HIWORD(vsfi->dwFileVersionLS);
    fVersion[3] = LOWORD(vsfi->dwFileVersionLS);
    pVersion[0] = HIWORD(vsfi->dwProductVersionMS);
    pVersion[1] = LOWORD(vsfi->dwProductVersionMS);
    pVersion[2] = HIWORD(vsfi->dwProductVersionLS);
    pVersion[3] = LOWORD(vsfi->dwProductVersionLS);

    printf("Product: %d.%d.%d.%d File: %d.%d.%d.%d\n", 
        pVersion[0], pVersion[1], 
        pVersion[2], pVersion[3], 
        fVersion[0], fVersion[1], 
        fVersion[2], fVersion[3]);
    delete[] versionInfo;

    return 0;
}



6> Franci Penov..:

您还可以查看filever.exe,它可以作为Windows XP SP2支持工具包的一部分下载 - 仅下载4.7MB.


它仅列出了fileversion,而不是其他版本方面.通常你也需要产品版本.`sigcheck`(如uvts_cvs提到的那样)也显示了这些,并且下载量要小得多.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有