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