TDM Geschrieben 2. Januar 2006 Geschrieben 2. Januar 2006 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*) Zitieren
Bubble Geschrieben 2. Januar 2006 Geschrieben 2. Januar 2006 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. Zitieren
TDM Geschrieben 3. Januar 2006 Autor Geschrieben 3. Januar 2006 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 ? Zitieren
TDM Geschrieben 3. Januar 2006 Autor Geschrieben 3. Januar 2006 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] } Zitieren
Klotzkopp Geschrieben 3. Januar 2006 Geschrieben 3. Januar 2006 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 Zitieren
TDM Geschrieben 3. Januar 2006 Autor Geschrieben 3. Januar 2006 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 ? Zitieren
Klotzkopp Geschrieben 3. Januar 2006 Geschrieben 3. Januar 2006 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 Zitieren
TDM Geschrieben 3. Januar 2006 Autor Geschrieben 3. Januar 2006 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? Zitieren
Klotzkopp Geschrieben 3. Januar 2006 Geschrieben 3. Januar 2006 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. Zitieren
TDM Geschrieben 3. Januar 2006 Autor Geschrieben 3. Januar 2006 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? Zitieren
Klotzkopp Geschrieben 3. Januar 2006 Geschrieben 3. Januar 2006 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. Zitieren
Empfohlene Beiträge
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.