API Win32, чтобы сказать, является ли данный двоичный файл (EXE или DLL) x86, x64, или ia64

Вы не можете сделать это вообще из-за стирания типа - экземпляр A не знает тип T. Если вам это нужно, одним из способов является использование литерала типа:

public class A
{
    private final Class clazz;

    public A(Class clazz)
    {
        this.clazz = clazz;
    }

    // Use clazz in here
}

Тогда:

A x = new A(String.class);

Это ужасно, но вот что делает стирание типа: (

Альтернативой является использование чего-то вроде TypeLiteral Гисе. Это работает, потому что аргумент типа, используемый для указания суперкласса , не удаляется. Поэтому вы можете сделать: 112]

a теперь относится к подклассу из A, поэтому, получив a.getClass().getSuperClass(), вы можете в конечном итоге вернуться к String. Это довольно ужасно.

6
задан user15071 9 June 2009 в 20:12
поделиться

2 ответа

Для EXE

используйте GetBinaryType (...)

Вот тот же вопрос для управляемого exe.

Для DLL (и EXE)

Используйте ImageNtHeader (...) , чтобы получить данные PE файла, а затем проверьте поле IMAGE_FILE_HEADER.Machine.

Вот код , который я нашел с помощью Google Code Search

Без очистки и без проверки ошибок

// map the file to our address space
// first, create a file mapping object
hMap = CreateFileMapping( 
  hFile, 
  NULL,           // security attrs
  PAGE_READONLY,  // protection flags
  0,              // max size - high DWORD
  0,              // max size - low DWORD      
  NULL );         // mapping name - not used

// next, map the file to our address space
void* mapAddr = MapViewOfFileEx( 
  hMap,             // mapping object
  FILE_MAP_READ,  // desired access
  0,              // loc to map - hi DWORD
  0,              // loc to map - lo DWORD
  0,              // #bytes to map - 0=all
  NULL );         // suggested map addr

peHdr = ImageNtHeader( mapAddr );
13
ответ дан 8 December 2019 в 16:09
поделиться

You can check the PE header yourself to read the IMAGE_FILE_MACHINE field. Here's a C# implementation that shouldn't be too hard to adapt to C++.

0
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: