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.

 Thread beobachten
 Thread beobachten Seitenaufteilung abschalten
 Seitenaufteilung abschalten