获取编译日期和时间来自.exe的时间

时间:2013-06-20 11:32:45

标签: c++ datetime compilation executable

我有全名&可执行文件的路径,例如C:\IW4\BIN\iw32.exe,并希望提取该可执行文件的编译日期和时间。

我该怎么做?我找不到合适的解决方案。

我的C ++程序必须使用Borland C ++ Builder在Windows下编译,如果该信息有任何价值。

编辑: 我发现了一些示例代码并且它有效,感谢您的所有指示和提示!

守则是:

#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

4 个答案:

答案 0 :(得分:2)

您要查找的信息可在可执行映像的IMAGE_FILE_HEADER中找到。您可以通过将字段指向图像中的偏移(艰难的方式)来检索此信息。另一种选择是使用Image Help Library

答案 1 :(得分:1)

您可以使用MapAndLoad和可执行文件名的完整路径来执行此操作,或使用GetModuleFileName为当前进程检索它。它将初始化LOADED_IMAGE结构。

在此结构中,您必须查找FileHeader成员,它是IMAGE_NT_HEADERS结构。从这一个,你必须寻找FileHeader,这是一个IMAGE_FILE_HEADER结构。在这一个中,您可以阅读TimeDateStamp。

IMAGE_FILE_HEADER中的TimeDateStamp表示链接器创建映像时的时间戳。它表示自1970年1月1日UTC时间00:00:00以来的秒数。从这里开始,您可以简单地将其转换为time_t,然后调用localtime来获取包含所需信息的struct 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

答案 2 :(得分:0)

您可以依赖操作系统的“创建日期”文件元数据(右键单击可执行文件并选择Properties),但如果文件是以不同方式创建的,则无法使用(例如,复制)。

您可以尝试的另一件事:C ++预处理器有一些您可以使用的宏:__DATE____TIME__。作为警告,这只会在预处理器运行时显示,而不是在可执行文件完全编译时显示。您可以将这些保存到程序中,然后在运行可执行文件时显示它们。

实际上,最简单的解决方案可能是在构建完成时将当前日期/时间保存在单独的文件中。

答案 3 :(得分:0)

如果您只想要一个日期或时间。(简单代码)

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

const char *buildTimeString ="" __TIME__ "";//for Time purpose