2013-06-20 3 views
4

У меня есть полное имя & путь исполняемого файла, например. C:\IW4\BIN\iw32.exe и хотите извлечь дату и время компиляции этого исполняемого файла.Получить компиляцию Дата и время от .exe

Как это сделать? Я не нашел подходящего решения.

Моя программа на C++ должна компилироваться под Windows с использованием Borland C++ Builder, если эта информация имеет ценность.

EDIT: Я нашел образец кода, и он работает, спасибо за все ваши указатели и подсказки!

Кодекс:

#include <stdio.h> 
#include <windows.h> 

int main (int argc, char** argv) 
{ 
    WIN32_FILE_ATTRIBUTE_DATA attr; 
    SYSTEMTIME creation; 

    if (argc < 2) 
     return 1; 
    GetFileAttributesEx(argv[1], GetFileExInfoStandard, &attr); 
    FileTimeToSystemTime(&attr.ftLastWriteTime, &creation); 
    printf("Created: %04d-%02d-%02d %02d:%02d:%02d\n" 
     "Size: %d bytes\n", 
     creation.wYear, creation.wMonth, creation.wDay, 
     creation.wHour, creation.wMinute, creation.wSecond, 
     attr.nFileSizeLow); 

    return 0; 
} 

который обеспечивает следующий вывод:

Created: 2013-06-20 12:37:14 
Size: 15098368 

ответ

2

Информация, которую вы ищете, находится в IMAGE_FILE_HEADER исполняемого файла. Вы можете получить эту информацию, указав поле по его смещению на изображении (жесткий путь). Другим вариантом является использование Image Help Library

+0

TimeDateStamp является поле, содержащее тезисы информацию. «Низкие 32 бита метки времени изображения.Это представляет собой дату и время, когда изображение было создано компоновщиком. Значение представлено в количестве секунд, прошедших с полуночи (00:00:00), 1 января, 1970, Universal Coordinated Time, согласно системным часам ». (из MSDN) – mox

+0

это поле фактически «необязательно». На некоторых изображениях этого поля нет. Некоторые из них имеют неправильное значение (например, -1). Загрузчик игнорирует это поле. – mox

+0

GetFileExInfoStandard (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365739(v=vs.85).aspx) НЕ извлекает данные, которые вы ищете. – mox

0

Вы можете полагаться на метаданных файла «Дата создания» операционной системы (правой кнопкой мыши на исполняемом и выберите Properties) , но это не сработает, если файл был создан по-другому (например, он был скопирован).

Еще одна вещь, которую вы могли бы попробовать: препроцессор C++ имеет несколько макросов, которые вы можете использовать: __DATE__ и __TIME__. Как предостережение, это покажет вам только, когда был запущен препроцессор, а не когда исполняемый файл был полностью скомпилирован. Вы можете сохранить их в программе, а затем отобразить их при запуске исполняемого файла.

Действительно, самым простым решением, вероятно, было бы сохранить текущую дату/время в отдельном файле всякий раз, когда будет выполнена сборка.

1

Вы можете сделать это с помощью MapAndLoad с полным путем к исполняемому имени файла или использовать GetModuleFileName, чтобы извлечь его для текущего процесса. Он инициализирует структуру LOADED_IMAGE.

В этой структуре вы должны искать элемент FileHeader, это структура IMAGE_NT_HEADERS. Из этого вы должны искать FileHeader, это структура IMAGE_FILE_HEADER. В этом вы можете прочитать TimeDateStamp.

TimeDateStamp от IMAGE_FILE_HEADER представляет собой метку времени, когда изображение было создано компоновщиком. Он выражается в секундах с 1 января 1970 года в 00:00:00 по UTC. Отсюда вы можете просто преобразовать его в time_t и вызвать их, например, localtime, чтобы получить структуру tm со всей необходимой информацией.

Список литературы

MapAndLoad https://msdn.microsoft.com/en-us/library/windows/desktop/ms680353(v=vs.85).aspx

MapAndUnload https://msdn.microsoft.com/en-us/library/windows/desktop/ms680353(v=vs.85).aspx

GetModuleFileName https://msdn.microsoft.com/en-us/library/windows/desktop/ms683197(v=vs.85).aspx

LOADED_IMAGE https://msdn.microsoft.com/en-us/library/windows/desktop/ms680349(v=vs.85).aspx

IMAGE_NT_HEADERS https://msdn.microsoft.com/en-us/library/windows/desktop/ms680336(v=vs.85).aspx

IMAGE_FILE_HEADER https://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx

0

Если вы хотите только один либо дату или время. (Простой код)

const char *buildDateString = "" __DATE__ "";//for date purpose 

const char *buildTimeString ="" __TIME__ "";//for Time purpose 
Смежные вопросы