【问题标题】:Get compilation Date & Time from .exe从 .exe 获取编译日期和时间
【发布时间】:2013-06-20 11:32:44
【问题描述】:

我有一个可执行文件的全名和路径,例如C:\IW4\BIN\iw32.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:%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

【问题讨论】:

    标签: c++ datetime compilation executable


    【解决方案1】:

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

    【讨论】:

    • TimeDateStamp 是包含论文信息的字段。 “图像时间戳的低 32 位。这表示链接器创建图像的日期和时间。该值表示自 1 月 1 日午夜 (00:00:00) 以来经过的秒数, 1970 年,世界协调时间,根据系统时钟。” (来自 MSDN)
    • 这个字段实际上是“可选的”。有些图像没有设置此字段。有些有错误的(例如-1)值。加载器会忽略此字段。
    • GetFileExInfoStandard (msdn.microsoft.com/en-us/library/windows/desktop/…) 不会检索您要查找的数据。
    • 只是为了比较你的结果,你可以使用 PeStudio winitor.com 这个工具以 RAW 方式显示链接器创建图像的时间。
    • 不知道这个。非常有用,比我的回答好得多。 +1
    【解决方案2】:

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

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

    IMAGE_FILE_HEADER 中的 TimeDateStamp 表示链接器创建图像时的时间戳。它以 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数表示。从这里,您可以简单地将其转换为 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

    获取模块文件名 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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-27
          • 2010-12-19
          • 2021-09-26
          • 1970-01-01
          • 2013-09-14
          相关资源
          最近更新 更多