Entwickler-Ecke

Windows API - Now() mit falschen Daten???


Flamefire - Fr 16.05.08 14:21
Titel: Now() mit falschen Daten???
Ich habe ein DLL in einen anderen Prozess injedcted
wenn ich aus dieser heraus das Datum über Now() bestimmen will, erhalte ich falsche Ergebnisse (sie liegen ca. +-4 minuten und bei erneuten aufruf von now erhalte ich die ganeu gleichen werte)
nach einigerzeit erhöht sich der wert und bleibt dann wieder dort für ne weile

wie kann das sein?

mir ist auch aufgefallen: aus einem thread der TThread Klasse heraus stimmen die Werte...


BenBE - Fr 16.05.08 14:57

Zeig mal, wie Du den Zeitwert von Now zwischen deinen Prozessen überträgst ... Hab da so ne Vermutung ...


Flamefire - Fr 16.05.08 15:35

hab jetzt mal alles durchgesucht und den "fehler" gefunden
ich hab einfach das was now() macht (und die unteraufrufe) selbst geschrieben mit debugausgaben
hat nix mit zeitwerten zu tun

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
function Now3: String;
var
  SystemTime: TSystemTime;
  td:TDateTime;
  tmpFloat,tmp:Extended;
const dday:Extended=60*60*24;
begin
  GetLocalTime(SystemTime);
  Result := Inttostr(systemTime.wHour)+':'+inttostr(systemtime.wMinute)+':'+inttostr(systemtime.wSecond); //ist korrekt
  with SystemTime do begin
    Ausgabe(inttostr(wHour)+':'+inttostr(wMinute)+':'+inttostr(wSecond),cOK); //korrekt
    td:=EncodeDate(wYear, wMonth, wDay);
    td:=td+wHour /24;
    td:=td+wMinute/(24*60);
    tmpFloat:=wSecond/(24*60*60);
    tmp:=td;
    Ausgabe(FloatToStr(tmp),cOK); //stimmt immer noch (Hier ist Pos 1)
    tmp:=tmp*dday;
    Ausgabe(FloatToStr(tmp)+' aaa '+inttostr(wSecond),cOK); //ab hier
    td:=tmp+10; //eindeutig oder?
    tmp:=tmp+wSecond;
    Ausgabe(FloatToStr(tmp),cOK); //aber tmp ist gleich
    tmp:=tmp/dday;
    td:=td/dday;
    Ausgabe(FloatToStr(td)+' '+Floattostr(tmp),cOK); //gleicher wert wie an pos 1
  end;
    Result:=DateTimeToStr(td);
end;


Dadurch fallen die Sekunden, zum Teil auch die minuten untern tisch....

asm:

Quelltext
1:
2:
172DCEF3                     DB6D D0                     FLD TBYTE PTR [EBP-30]
172DCEF6                     D805 04D02D17               FADD DWORD PTR [172DD004] //der inhalt ist 10.0000 aber es passiert gar nix (ollydbg)

entspricht

Delphi-Quelltext
1:
    td:=tmp+10;                    


ich versteh das nicht...

EDIT: Ich hab den Fehler jetzt umgangen indem ich ne eigne zeit-unit geschrieben hab die auf nem cardinal typ basiert (sekunden seit tag x)

einzige sache: ich hab noch teile wie das hier:


Delphi-Quelltext
1:
2:
m:=s div 60;
s:=s mod 60;


wie war das da mit geschwindigkeit von div und modulo?
bin ich statt dem div vl mit trunc() schneller? oder ist div schneller?