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

31
我正在寻找在Windows命令提示符中告诉我特定DLL文件是32位还是64位的命令。在Windows中是否有这样的命令?

我该如何测试Windows DLL以确定它是32位还是64位?https://dev59.com/H3RB5IYBdhLWcg3w1Kr0 - user184968
谢谢,我检查了这个,但我需要一个Windows命令而不是一个脚本。 - becks
dumpbincygwin file.exe 也在那里提到。 - user184968
2
这个回答解决了你的问题吗?如何查找本地DLL文件是作为x64还是x86编译的? - StayOnTarget
4个回答

35

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
@becks:没有内置的功能。您必须提供一个实现,可以是您自己的实现或类似于“dumpbin”的东西。 - Jon

5
如果您已安装了7zip:
"C:\Program Files\7-Zip\7z.exe" l "my-program.exe" | findstr CPU

3
您可以使用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调用的方法。

1
你所寻找的功能在UNIX系统上是原生可用的,使用“file”命令即可。如果你安装了Cygwin或其他UNIX模拟器,也可以在Windows系统上使用“file”命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接