web-dev-qa-db-fra.com

Commande Windows pour savoir si un fichier .dll est 32 bits ou 64 bits?

Je cherche une commande dans Windows cmd pour me dire si un certain fichier DLL est 32 bits ou 64 bits

Y a-t-il quelque chose comme ça dans les fenêtres?

26
becks

DUMPBIN est inclus avec Visual C++ et peut fournir ces informations avec le /HEADERS commutateur.

Exemple de sortie d'une image 32 bits:

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
31
Jon

Vous pouvez utiliser la bibliothèque dbghelp pour obtenir les en-têtes d'image. Ensuite, vous pouvez lire les informations dont vous avez besoin dans le FileHeader.

Voici un exemple de code. Veuillez pardonner la gestion des erreurs plutôt boiteuse. Je viens de le faire rapidement pour illustrer, et je ne parle même pas à distance en 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;
}

Pour lier cela, vous devez ajouter dbghelp.lib aux dépendances supplémentaires de votre projet. Pour en savoir plus sur les détails derrière cela, reportez-vous à la documentation MSDN pour les différents appels d'API utilisés.

3
David Heffernan

La capacité que vous recherchez est disponible en natif sur les systèmes UNIX; utilisez la commande 'file'. Vous pouvez utiliser "fichier" sur les systèmes Windows si vous installez Cygwin ou l'un des autres émulateurs UNIX.

1
Chris Golledge