5

我有一个可执行文件的全名和路径,例如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
4

4 回答 4

3

The information your're looking for is to be found in the IMAGE_FILE_HEADER of the executable image. You can retrieve this information either by pointing the field by its offset in the image (the hard way). Another option would be to use the Image Help Library

于 2013-06-20T11:48:46.687 回答
1

您可以使用带有可执行文件名的完整路径的 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

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

于 2016-11-18T14:37:12.883 回答
0

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

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

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

于 2013-06-20T11:42:26.327 回答
0

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

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

const char *buildTimeString ="" __TIME__ "";//for Time purpose
于 2017-09-15T04:58:50.817 回答