Builddate einer EXE ermitteln

Gast #2947120
Lesenswert?

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
Persönliche Seite #2947189
Lesenswert?

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
}
(Firma: JDCC) #2948443
Lesenswert?

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 ???
Persönliche Seite #2948527
Lesenswert?

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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren