Autor Beitrag
Biasto
Hält's aus hier
Beiträge: 1

W2k
Anfänger
BeitragVerfasst: Sa 11.12.04 12:20 
Hallo an alle...

bin neu hier, und hab gleich eine Frage:
Ich versuche mittels der Komponente NMTime von der FastNet-Komponente die Systemzeit stellen zu lassen. Nur jedesmal, wenn ich versuche, diese zu stellen (per Click auf einen Button) sagt er mir entweder "Connection Timed out" oder er stellt zwar dir Systemzeit, steigt aber dann sofort danach, oder dabei aus dem Programm aus! Vielleicht kann mir ja jemand helfen, der damnit schon Erfahrung gemacht hat, oder schon ähnliche Sachen versucht hat, zu realisieren. Das Problem is dringend, weil ich es zu meiner Studienarbeit benötige...
Hier das Code-Beispiel, mit dem ich versuche, die Zeit zu holen bzw. dann zu setzen.
ausblenden 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:
procedure TSynchronisator.FetchTime(Sender: TObject);
var
   Atomzeit: string;
   dakt: TDateTime;
   stakt: TSystemTime;
begin
      TRY
      NMTime1.Host := cbTimeServer.Text;
      begin
      Atomzeit := NMTime1.TimeStr;
      
      dakt := date +StrToTime (Atomzeit);     // das aktuelle Datum soll beibehalten werden
      DateTimeToSystemTime(dakt, stakt);
      stakt.wHour:= stakt.wHour+1;
      SetLocalTime(stakt);
      ShowMessage('Systemzeit wurde gestellt! Nächste Stellung in 24 Stunden.');
      end
      

      EXCEPT
      on ESockError do
      ShowMessage('Verbindung schlug fehl, Internet verbunden?');
      

      end;


Danke schonmal im voraus...

Grüße Biasto
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mo 13.12.04 10:47 
Hi!

Also ich hab genau soetwas auch schon mal realisiet. Ich hab das mit der Indy Komponente IdTime gemacht. Indy bekommszt konstenlos im Internet -> Google. Das machst dann etwa so:

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
// Hiermit setze ich die Zeit auf dem lokalen Rechner:
function SetPCSystemTime(dDateTime: TDateTime): Boolean;                // SwissDelphiCenter: Tip #90
const
  SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege'; 
var
  hToken: THandle;
  ReturnLength: DWORD; 
  tkp, PrevTokenPriv: TTokenPrivileges; 
  luid: TLargeInteger; 
  dSysTime: TSystemTime; 
begin 
  Result := False;
  if (Win32Platform = VER_PLATFORM_WIN32_NT) then 
  begin 
    if OpenProcessToken(GetCurrentProcess, 
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then 
    begin 
      try 
        if not LookupPrivilegeValue(nil, SE_SYSTEMTIME_NAME, luid) then
Exit; 
        tkp.PrivilegeCount := 1; 
        tkp.Privileges[0].luid := luid; 
        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; 
        if not AdjustTokenPrivileges(hToken, False, tkp,
SizeOf(TTOKENPRIVILEGES), 
          PrevTokenPriv, ReturnLength) then 
          Exit; 
        if (GetLastError <> ERROR_SUCCESS) then 
        begin 
          raise Exception.Create(SysErrorMessage(GetLastError)); 
          Exit; 
        end; 
      finally 
        CloseHandle(hToken); 
      end; 
    end; 
  end; 
  DateTimeToSystemTime(dDateTime, dSysTime); 
  Result := Windows.SetLocalTime(dSysTime); 
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
// So holst du die Zeit vom Server:
IdTime1.Host := sHost;
try
  dtTime := IdTime1.DateTime;        // Exception abfangen; evtl. liefert IdTime1.DateTime auch 0 zurück ohne Exception
except
  dtTime := 0;
end;
if dtTime = 0 then
begin
  Showmessage('Error recieving time!');
  exit;
end;
if not SetPCSystemTime(dtTime) then
begin
  Showmessage('Error setting time!');
  exit;
end;




MfG

MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems