Я ищу команду в cmd cmd, чтобы сообщить мне, является ли определенный DLL файл 32-битным или 64-битным
Есть ли что-то подобное в окнах?
Я ищу команду в cmd cmd, чтобы сообщить мне, является ли определенный DLL файл 32-битным или 64-битным
Есть ли что-то подобное в окнах?
DUMPBIN
включен в Visual С++ и может предоставить эту информацию с помощью переключателя /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
Вы можете использовать библиотеку dbghelp для получения заголовков изображений. Затем вы можете прочитать необходимую информацию из FileHeader
.
Вот пример кода. Прошу прощения за довольно хромую обработку ошибок. Я просто быстро сбил его, чтобы проиллюстрировать, и я даже не умею свободно говорить на С++.
#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, которые используются.
Возможности, которые вы ищете, доступны изначально в системах UNIX; используйте команду "файл". Вы можете использовать "файл" в системах Windows, если вы устанавливаете Cygwin или один из других эмуляторов UNIX.