Hallo, ich möchte das BuildDate einer Exe ermittlen. Also das aktuelle Datum beim kompilieren! Das ganze klappt auch gut für andere BuildInfos mit der üblichen Vorgehensweise -> VS_VERSION_INFO. Die Struktur VS_VERSION_INFO kann man mit Schlüsselwörtern "befüllen" VALUE "FileVersion", VERSIONSTRING VALUE "InternalName", "MyFile" VALUE "ProductName", "MyProduct" VALUE "Revision", REVISIONSTRING VALUE "ProductVersion", VERSIONSTRING VALUE "LegalCopyright", LEGAL_COPYRIGHT VALUE "BuildDate", BUILDDATE --> wie befülle ich das Datum ?? (mit _DATE_ klappts nicht!! und von hand möchte ich es auch nicht reinschreiben - das soll automatisch gehen!! ps: ich entwickle in C mit VS2008 WinXP Danke Gruss
WinProgrammer schrieb: > VALUE "BuildDate", BUILDDATE --> wie befülle ich das Datum ?? Das funktioniert einfach nicht. Und hat noch nie funktioniert. Macht aber nichts, weil das Build-Date dem PE-Header entnommen werden kann.
1 | BOOL GetPeTime(LPCCH FileName, SYSTEMTIME* pZeit) |
2 | {
|
3 | HFILE hFile; |
4 | OFSTRUCT OfBuf; |
5 | FILETIME Zeit; |
6 | FILETIME PeZeit; |
7 | HANDLE hMap; |
8 | PIMAGE_DOS_HEADER pDosHeader; |
9 | PIMAGE_NT_HEADERS pNTHeader; |
10 | PIMAGE_FILE_HEADER pImageFileHeader; |
11 | LONGLONG ll; |
12 | |
13 | PeZeit.dwHighDateTime = 0; |
14 | PeZeit.dwLowDateTime = 0; |
15 | |
16 | hFile = OpenFile(FileName, &OfBuf, OF_READ); |
17 | |
18 | if (hFile == HFILE_ERROR) |
19 | return (FALSE); |
20 | |
21 | hMap = CreateFileMapping((HANDLE) hFile, NULL, PAGE_READONLY, 0, 0, NULL); |
22 | |
23 | if (hMap) |
24 | {
|
25 | pDosHeader = (PIMAGE_DOS_HEADER) MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); |
26 | |
27 | if (pDosHeader) |
28 | {
|
29 | if (pDosHeader->e_magic == IMAGE_DOS_SIGNATURE) |
30 | {
|
31 | pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew); |
32 | |
33 | if (pNTHeader) |
34 | {
|
35 | if (pNTHeader->Signature == IMAGE_NT_SIGNATURE) |
36 | {
|
37 | pImageFileHeader = &(pNTHeader->FileHeader); |
38 | |
39 | if (pImageFileHeader) |
40 | {
|
41 | if (pImageFileHeader->TimeDateStamp) |
42 | {
|
43 | ll = Int32x32To64(pImageFileHeader->TimeDateStamp, 10000000) + 116444736000000000; |
44 | PeZeit.dwLowDateTime = (DWORD) (ll & 0xFFFFFFFF); |
45 | PeZeit.dwHighDateTime = ll >> 32; |
46 | }
|
47 | }
|
48 | }
|
49 | }
|
50 | }
|
51 | |
52 | UnmapViewOfFile(pDosHeader); |
53 | }
|
54 | CloseHandle(hMap); |
55 | }
|
56 | |
57 | CloseHandle((HANDLE) hFile); |
58 | |
59 | if (PeZeit.dwHighDateTime) |
60 | Zeit = PeZeit; |
61 | |
62 | FileTimeToSystemTime(&Zeit, pZeit); |
63 | |
64 | return (TRUE); |
65 | }
|
Servus Rufus, ist das das Datum der Erstellung der .exe (vom Linker) ? MakePtr() kennt mein Watcom nicht ...
Joachim Drechsel schrieb: > ist das das Datum der Erstellung der .exe (vom Linker) ? Bei MS-Compilern ja. Was MakePtr macht, kann ich Dir morgen raussuchen.
Ah, das ist nur ein simples Macro, das ich zu kopieren vergaß:
1 | #define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (DWORD)(addValue))
|
Kleiner Nachtrag: Man sollte pZeit nochmal durch GetLocalTime() jagen sonst zeigt es eine Stunde zu wenig an ...
1 | Test() |
2 | {
|
3 | SYSTEMTIME tim; |
4 | |
5 | GetPeTime( "test.exe", &tim); |
6 | GetLocalTime( &tim); |
7 | |
8 | printf( "\n%04d-%02d-%02d %02d:%02d", |
9 | tim.wYear, tim.wMonth, tim.wDay, tim.wHour, tim.wMinute); |
10 | }
|
Den eigenen Namen findet es anscheinend auch bei einem Aufruf von der Console über pfad/test.exe ???
Joachim Drechsel schrieb: > Den eigenen Namen findet es anscheinend auch bei einem Aufruf von > der Console über pfad/test.exe ??? Was meinst Du?
Um die Datei zu öffnen in: hFile = OpenFile(FileName, &OfBuf, OF_READ);
Joachim Drechsel schrieb: > Man sollte pZeit nochmal durch GetLocalTime() jagen sonst zeigt > es eine Stunde zu wenig an ... > Test() > { > SYSTEMTIME tim; > > GetPeTime( "test.exe", &tim); > GetLocalTime( &tim); Nein. GetLocalTime bestimmt die aktuelle Zeit, und interessiert sich nicht für das, was vorher in der SYSTEMTIME-Struktur dringestanden hat. Du willst SystemTimeToTzSpecificLocalTime verwenden. Wird dieser Funktion als erster Parameter ein NULL-Pointer übergeben, wertet sie die aktuelle Zeitzone aus. Also:
1 | SYSTEMTIME PeZeit; |
2 | SYSTEMTIME LokalZeit; |
3 | |
4 | SystemTimeToTzSpecificLocalTime(NULL, &PeZeit, &LokalZeit); |
Wenn Du den Dateinamen Deines Programmes selbst bestimmen willst, kannst Du das so anstellen:
1 | CHAR FileName[MAX_PATH]; |
2 | |
3 | if (!GetModuleFileName(NULL, FileName, MAX_PATH - 1)) |
4 | return (FALSE); |
Oh ich Depp ;) Im Helpfile verlesen umkipp Mit GetModuleFilename() habe ich es eingebaut.
Joachim Drechsel schrieb: > Im Helpfile verlesen *umkipp* Aua ... Gute Besserung & schönes Wochenende.
Auf jeden Fall geht es jetzt. Nach so einer Funktion hatte ich schon länger gesucht. Beim Kopieren geht halt ab und zu mal das Dateidatum verloren. Nur mit _DATE__ und __TIME_ muß ich das File mit main() halt ständig mitkompilieren ... Danke nochmal und auch ein schönes Wochenende !
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.