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?
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
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.
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.