Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zeitsynchronisation

Empfohlene Antworten

Veröffentlicht

Wie kann ich die Zeit mit einem Server abgleichen ohne system("net time ...") zu benutzen ?

Da muss es doch irgendwelche Funktionen geben, nur ich such jetzt seit über ner Stunde in der MSDN und find einfach nix (englisch zu lernen wär ne Idee *g*)

Wie kann ich die Zeit mit einem Server abgleichen ohne system("net time ...") zu benutzen ?

Da muss es doch irgendwelche Funktionen geben, nur ich such jetzt seit über ner Stunde in der MSDN und find einfach nix (englisch zu lernen wär ne Idee *g*)

Die Funktionen zum stellen der Uhr sind Dir bekannt? Dann lies insbesondere RFC 1305 und implementiere das Protokoll, es ist aber mit Aufwand verbunden. Es gibt eine Referenzimplementierung, inwiefern Du sie in Deinem Programm verwenden kannst/darfst, musst Du prüfen bzw. prüfen lassen.

  • Autor

Ich hab es mehr oder weniger auch einfacher geschaft.

Sobald man auf eine Datei zugreift wird das ja notiert, wenn ich jetzt den Zugriff von der Datei mit sich selber prüf, dann ist das ja JETZT GERADE, also die Zeit die ich haben will, muss das halt nur noch konvertieren.

Hab das auch schon ausprobiert, ich hab um 8 auf den Server zugegriffen, als ich die Zeit dann auf dem Client auf 12:xx gestellt hatte, war der letzte Zugriff der Datei immernoch ca. um 8

Vielleicht nicht der beste Stil, aber es geht:


BOOL SetSystemTimeFromServer(HANDLE hFile)

{

[INDENT]

LPFILETIME = lpLastAccessTime = new FileTime;

LPSYSTEMTIME = lpSystemTime = new SystemTime;

BOOL bResult;

GetFileTime (hFile, lpLastAccessTime, NULL);

bResult = FileTimeToSystemTime(lpLastAccessTime, lpSystemTime);

SetSystemTime(lpSystemTime);

return bResult;

[/INDENT]


}

Bis jetzt hab ich nur noch das Problem, das ich bei GetFileTime einen Error 6 bekomm, das heißt, dass das HANDLE nicht korrekt ist.

Darf ich keine UNC - Pfade zu Dateien machen ? :(

  • Autor

ok, das ganze nochmal mit Abbruch beim Fehler:


BOOL SetSystemTimeFromServer(LPCSTR lpFile)

{

[INDENT]LPWIN32_FIND_DATA lpFileData = new WIN32_FIND_DATA;

LPSYSTEMTIME lpSystemTime = new SystemTime;

BOOL bResult = ~FALSE;

HANDLE hFile = FindFirstFile(lpFile, lpFileData);

if (GetLastError() == ERROR_SUCCESS)

{[INDENT]bResult = FileTimeToSystemTime(&(lpFileData -> ftLastAccessTime), lpSystemTime);

SetSystemTime(lpSystemTime);[/INDENT]


}

FindClose(hFile);

return bResult;[/INDENT]

}

:)

FindFirstFile gibt INVALID_HANDLE_VALUE zurück, wenn etwas nicht funktioniert hat. Nur dann ist es sinnvoll, GetLastError aufzurufen.

Außerdem hast du da zwei schöne Speicherlecks. Warum benutzt du überhaupt new, statt normale Autovariablen zu verwenden?

Und weil das alles nichts mehr mit Standard-C++ zu tun hat: Verschoben -> C++: Compiler, IDEs, APIs

  • Autor
FindFirstFile gibt INVALID_HANDLE_VALUE zurück, wenn etwas nicht funktioniert hat. Nur dann ist es sinnvoll, GetLastError aufzurufen.

Wieso ?

Was ist wenn ich keine Rechte hab, um drauf zu zugreifen (ect...)?

Außerdem hast du da zwei schöne Speicherlecks. Warum benutzt du überhaupt new, statt normale Autovariablen zu verwenden?

Wie jetzt ?

Für Zeiger muss man doch Speicher reservieren ?

oder meinst du normale Variablen und dann über den Adressoperator ?

Wieso ?
Wieso was?

Ob FindFirstFile geklappt hat, erkennst du am Rückgabewert von FindFirstFile, nicht an dem von GetLastError. GetLastError ist im Allgemeinen sinnlos, wenn vorher nicht etwas schiefgegangen ist. Du kannst mit GetLastError nicht feststellen, ob etwas fehlgeschlagen ist. Du kannst damit nur feststellen, warum etwas fehlgeschlagen ist, wenn es denn passiert ist.

Wie jetzt ?

Für Zeiger muss man doch Speicher reservieren ?

Du brauchst hier keine Zeiger.

oder meinst du normale Variablen und dann über den Adressoperator ?
Genau ;)
  • Autor


BOOL SetSystemTimeFromServer(LPCSTR lpFile)

{

[INDENT]WIN32_FIND_DATA FileData;

SYSTEMTIME SystemTime;

BOOL bResult = ~FALSE;

HANDLE hFile;

if ((hFile = FindFirstFile(lpFile, &FileData)) != INVALID_HANDLE_VALUE)

{

[INDENT]bResult = FileTimeToSystemTime(&(lpFileData -> ftLastAccessTime), &SystemTime);

SetSystemTime(&SystemTime);[/INDENT]


}

FindClose(hFile);

return bResult;[/INDENT]

}

so besser?

Schon besser. Eine Zuweisung in der if-Anweisung ist zwar nicht so schön, und hier auch unnötig, aber das ist kein Fehler.

Du musst nur darauf achten, dass sich SetSystemTime nicht diesen Zeiger merkt, denn der ist nicht mehr gültig, wenn die Funktion SetSystemTimeFromServer beendet ist.

  • Autor
Schon besser. Eine Zuweisung in der if-Anweisung ist zwar nicht so schön, und hier auch unnötig, aber das ist kein Fehler.

Wie jetzt ?

Ich muss doch dem hFile auch was zuordnen oder meinst du ich soll das davor zuordnen und in der if einfach nur abprüfen ?

Weil theoretisch ist das doch egal - es wird vorher zugewiesen und dann überprüft.

aber man kanns ja auch so machen:


HANDLE hFile= FindFirstFile(lpFile, &FileData);

if (hFile != INVALID_HANDLE_VALUE)

...

Du musst nur darauf achten, dass sich SetSystemTime nicht diesen Zeiger merkt, denn der ist nicht mehr gültig, wenn die Funktion SetSystemTimeFromServer beendet ist.

Dacht ich mir auch, wird der nicht eigentlich verworfen wenn die Funktion beendet ist ? (Ist ja eine Lokale Variable und wird dann nicht mehr benötigt.)

Oder was meinst du?

aber man kanns ja auch so machen:
Genau so meinte ich es.

Dacht ich mir auch, wird der nicht eigentlich verworfen wenn die Funktion beendet ist? (Ist ja eine Lokale Variable und wird dann nicht mehr benötigt.)
Das SYSTEMTIME-Objekt wird wieder zerstört. Der Zeiger ist innerhalb von SetSystemTimeFromServer ein temporäres Objekt, dass vom Adressoperator erzeugt wird und für die Dauer des Aufrufs von SetSystemTime besteht. In SetSystemTime hast du (vermutlich, wenn du den Zeiger by value übergibst) eine Kopie dieses temporären Objekts. Wenn die SetSystemTime-Funktion diesen Zeiger zur späteren Verwendung in einer statischen oder globalen Variablen ablegt, gibt es Probleme. Wenn sie ihn nur während ihrer eigenen Laufzeit benutzt, ist das in Ordnung.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.