Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

FileTimeToSystemTime: Zeit konvertieren via dllcall



  • Please log in to reply
2 replies to this topic
Reisetiger
  • Members
  • 2 posts
  • Last active: May 18 2015 07:26 PM
  • Joined: 16 May 2015

Hallo ihr Lieben! Vor 6 Jahren, als ich das letzte Mal was mit AHK gemacht habe, gab es im deutschen Forum immer super Hilfe. Ich hoffe das setzt sich hier nun fort. happy.png
Also, ich habe aus einem IE Cookie einen Zeitstempel ausgelesen. Nach langer Recherche ist mir nun klar, dass dieser wohl als FILETIME vorliegt (siehe hier und hier).
Ich habe also für den Zeitstempel jeweils 2 Werte in getrennten Variablen:

timelow = 2731047424
timehigh = 30463431

Diese Zeit muss ich nun irgendwie in ein lesbares Format konvertieren. Ich brauche später sowas wie YYYYMMDDHH24MISS, um es in einer GUI auszugeben. Meine Beispieldaten müssten ergeben: 2015-08-13 14:57:40 (ggf. noch die falsche Zeitzone).
 
Folgende Infos habe ich zum Aufbau der FILETIME gefunden:
 

The FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601. The structure consists of two 32-bit values that combine to form a single 64-bit value.


Auch eine Art Formel habe ich gefunden. Ich weiß aber erstens nicht, wie ich sowas in AHK rechne, zweitens hat die Formel anscheinend einen Fehler (geht evtl. vom falschen Startpunkt aus).

t = 1e-7*(high*pow(2,32)+low) – 11644473600

Ich denke mittlerweile, dass ich das umrechnen nur via dllcall realisieren kann. Kernel32 bietet ja eine Funktion namens FileTimeToSystemTime. Ich verstehe nur nicht, wie ich die Funktion richtig aufrufe, und wie ich meine beiden Werte daran übergebe. So sieht mein (von Andreone kopierter) Code nun aus:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#Warn  ; Recommended for catching common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

timelow = 2731047424
timehigh = 30463431

Zeit := FileTimeToStr("123456") ;hier müssen timelow und timehigh wohl irgendwie rein
MsgBox Zeit #%Zeit%.

; FileTimeToSystemTime: http://msdn2.microsoft.com/en-us/library/ms724280.aspx
;~ typedef struct _SYSTEMTIME {
;~   WORD wYear;
;~   WORD wMonth;
;~   WORD wDayOfWeek;
;~   WORD wDay;
;~   WORD wHour;
;~   WORD wMinute;
;~   WORD wSecond;
;~   WORD wMilliseconds;
;~ } SYSTEMTIME;

FileTimeToStr(ByRef @FileTime)
{
    VarSetCapacity(SystemTime, 16, 0)
    DllCall("FileTimeToLocalFileTime", "uint", &@FileTime, "uint", &@FileTime)
    DllCall("FileTimeToSystemTime", "uint", &@FileTime, "uint", &SystemTime)
  str = ;leere Variable erstellen
    str .= NumGet(SystemTime, 0, "ushort")
    str .= StrLen(Word := NumGet(SystemTime,  2,"ushort")) == 1 ? ("0" . Word) : Word
    str .= StrLen(Word := NumGet(SystemTime,  6,"ushort")) == 1 ? ("0" . Word) : Word
    str .= StrLen(Word := NumGet(SystemTime,  8,"ushort")) == 1 ? ("0" . Word) : Word
    str .= StrLen(Word := NumGet(SystemTime, 10,"ushort")) == 1 ? ("0" . Word) : Word
    str .= StrLen(Word := NumGet(SystemTime, 12,"ushort")) == 1 ? ("0" . Word) : Word
    return str
}

Irgendwas gibt mir der Aufruf auch zurück. Aber ich verstehe ehrlichgesagt garnicht, was ich hier mache und wie es richtig sein muss. HILFE!!! sad.png

 

Ich hoffe ihr könnt mich retten! Liebe Grüße, Holger



Ragnar
  • Members
  • 68 posts
  • Last active: Aug 26 2015 12:18 PM
  • Joined: 02 Oct 2006
✓  Best Answer
...

timelow = 2731047424
timehigh = 30463431

VarSetCapacity(struct, 8)
NumPut(timelow, struct)
NumPut(timehigh, struct, 4)

Zeit := FileTimeToStr(struct) ;hier müssen timelow und timehigh wohl irgendwie rein
MsgBox Zeit #%Zeit%.

...


Reisetiger
  • Members
  • 2 posts
  • Last active: May 18 2015 07:26 PM
  • Joined: 16 May 2015

Wuaaah! Das funktioniert!! :D

 

Vielen vielen Dank, das hilft mir so sehr, ich hätte das nie selbst rausgefunden!