从.exe获取编译日期和时间

Get compilation Date & Time from .exe

本文关键字:时间 日期 编译 exe 获取      更新时间:2023-10-16

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

我该怎么做?我找不到合适的解决办法。

我的c++程序必须在Windows下使用Borland c++ Builder编译,如果这些信息是有价值的。

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

代码是:

#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:%02dn"
       "Size: %d bytesn",
       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

您要查找的信息可以在可执行映像的IMAGE_FILE_HEADER中找到。您可以通过指向该字段在图像中的偏移量来检索此信息(比较困难的方法)。另一个选择是使用图像帮助库

您可以使用MapAndLoad与可执行文件名的完整路径或使用GetModuleFileName为当前进程检索它来做到这一点。它将初始化一个LOADED_IMAGE结构体。

在这个结构中,你必须寻找FileHeader成员,它是一个IMAGE_NT_HEADERS结构。从这里,您必须查找FileHeader,这是一个IMAGE_FILE_HEADER结构。在本例中,您可以读取时间日期戳。

IMAGE_FILE_HEADER中的TimeDateStamp表示链接器创建图像的时间戳。单位为秒,从UTC时间1970年1月1日00:00:00开始。从这里,您可以简单地将其转换为time_t,然后调用,例如localtime,以获得包含所需所有信息的结构体tm。

引用

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

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

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

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

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

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

你可以依靠操作系统的'创建日期'文件元数据(右键单击可执行文件并选择Properties),但如果文件是以不同的方式创建的(例如它被复制),这将不起作用。

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

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

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

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