Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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*)

Geschrieben
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.

Geschrieben

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 ? :(

Geschrieben

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]

}

:)

Geschrieben

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

Geschrieben
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 ?

Geschrieben
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 ;)
Geschrieben


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?

Geschrieben

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.

Geschrieben
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?

Geschrieben
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.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...