Forum: PC-Programmierung Builddate einer EXE ermitteln


von WinProgrammer (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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
}

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Servus Rufus,

ist das das Datum der Erstellung der .exe (vom Linker) ?
MakePtr() kennt mein Watcom nicht ...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Danke !

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ah, das ist nur ein simples Macro, das ich zu kopieren vergaß:
1
#define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (DWORD)(addValue))

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Danke schön ... werde ich gleich mal probieren !

von Joachim D. (Firma: JDCC) (scheppertreiber)


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 ???

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joachim Drechsel schrieb:
> Den eigenen Namen findet es anscheinend auch bei einem Aufruf von
> der Console über pfad/test.exe ???

Was meinst Du?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Um die Datei zu öffnen in:

 hFile = OpenFile(FileName, &OfBuf, OF_READ);

von Rufus Τ. F. (rufus) Benutzerseite


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

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Oh ich Depp ;) Im Helpfile verlesen umkipp

Mit GetModuleFilename() habe ich es eingebaut.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joachim Drechsel schrieb:
> Im Helpfile verlesen *umkipp*


Aua ... Gute Besserung & schönes Wochenende.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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
Noch kein Account? Hier anmelden.