Windows 命令判断 .dll 文件是 32 位还是 64 位?

Posted

技术标签:

【中文标题】Windows 命令判断 .dll 文件是 32 位还是 64 位?【英文标题】:Windows command to tell whether a .dll file is 32 bit or 64 bit? 【发布时间】:2013-01-11 17:20:24 【问题描述】:

我在 windows cmd 中寻找一个命令来告诉我某个 dll 文件是 32 位还是 64 位

windows里面有这样的东西吗?

【问题讨论】:

如何测试 Windows dll 以确定它是 32 位还是 64 位? ***.com/questions/495244/… 谢谢,我检查了这个,但我需要一个 windows 命令而不是脚本。 dumpbincygwin file.exe 也被提及 这能回答你的问题吗? How to find if a native DLL file is compiled as x64 or x86? 【参考方案1】:

DUMPBIN 包含在 Visual C++ 中,可以通过 /HEADERS 开关提供此信息。

32 位图像的示例输出:

FILE HEADER VALUES
     14C machine (i386)
       6 number of sections
306F7A22 time date stamp Sun Oct 01 22:35:30 1995
       0 file pointer to symbol table
     1D1 number of symbols
      E0 size of optional header
     302 characteristics
            Executable
            32 bit word machine
            Debug information stripped

【讨论】:

谢谢你,它适用于安装了 Visual C++ SDK 的 Windows。但我的目标是一台没有安装 SDK 的机器。还有其他命令吗?! @becks:没有内置任何东西。您必须提供一个实现,无论是您自己的还是 dumpbin 之类的。【参考方案2】:

您可以使用 dbghelp 库来获取图像标题。然后您可以从FileHeader 中读取您需要的信息。

这里有一些示例代码。请原谅相当蹩脚的错误处理。我只是为了说明而快速敲了它,而我什至不会流利地使用 C++。

#include <Windows.h>
#include <Dbghelp.h>

#include <string>
#include <iostream>

using namespace std;

bool GetImageFileHeaders(wstring fileName, IMAGE_NT_HEADERS &headers)

    HANDLE fileHandle = CreateFile(
        fileName.c_str(),
        GENERIC_READ,
        FILE_SHARE_READ,
        nullptr,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        0
    );
    if (fileHandle == INVALID_HANDLE_VALUE)
        return false;

    HANDLE imageHandle = CreateFileMapping(
        fileHandle,
        nullptr,
        PAGE_READONLY,
        0,
        0,
        nullptr
    );
    if (imageHandle == 0)
    
        CloseHandle(fileHandle);
        return false;
    

    void *imagePtr = MapViewOfFile(
        imageHandle,
        FILE_MAP_READ,
        0, 
        0,
        0
    );
    if (imagePtr == nullptr)
    
        CloseHandle(imageHandle);
        CloseHandle(fileHandle);
        return false;
    

    PIMAGE_NT_HEADERS headersPtr = ImageNtHeader(imagePtr);
    if (headersPtr == nullptr)
    
        UnmapViewOfFile(imagePtr);
        CloseHandle(imageHandle);
        CloseHandle(fileHandle);
        return false;
    

    headers = *headersPtr;

    UnmapViewOfFile(imagePtr);
    CloseHandle(imageHandle);
    CloseHandle(fileHandle);

    return true;


int main(int argc, char* argv[])

    IMAGE_NT_HEADERS headers;
    if (GetImageFileHeaders(L"C:\\windows\\system32\\user32.dll", headers))
    
        if (headers.FileHeader.Machine == IMAGE_FILE_MACHINE_I386)
            cout << "x86";
        else if (headers.FileHeader.Machine == IMAGE_FILE_MACHINE_IA64)
            cout << "IA64";
        else if (headers.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64)
            cout << "x64";
        else
            cout << "Machine not recognised";
    
    return 0;

要链接它,您需要将dbghelp.lib 添加到项目的其他依赖项中。要详细了解这背后的详细信息,请参阅 MSDN 文档以了解所使用的各种 API 调用。

【讨论】:

【参考方案3】:

如果你已经安装了 7zip:

"C:\Program Files\7-Zip\7z.exe" l "my-program.exe" | findstr CPU

【讨论】:

【参考方案4】:

您正在寻找的功能在 UNIX 系统上本机可用;使用“文件”命令。如果您安装了 Cygwin 或其他 UNIX 模拟器之一,则可以在 Windows 系统上使用“文件”。

【讨论】:

以上是关于Windows 命令判断 .dll 文件是 32 位还是 64 位?的主要内容,如果未能解决你的问题,请参考以下文章

dumpbin判断windows程序是32还是64位(包括DLL)

windows下命令行编译DLL

在windows10怎么把文件ocx注册?

检测dll是32/64位?(直接读dll文件包含的某几个字节进行判断)

dll文件放在哪?dll文件怎么注册

dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)