33. Jak odczytać datę z serwera?
Niekiedy musimy zabezpieczyć program przed zmianą daty na stacji roboczej.
Narzucającym się rozwiązaniem jest odczytanie daty nie z komputera lokalnego,
ale z serwera. Tylko jak to zrobić? Jednym ze sposobów jest edycja dowolnego
pliku na serwerze i odczytanie daty jego modyfikacji. Inna metoda polega na
wykorzystaniu funkcji API, oto ona:'Na początek kilka deklaracji
Private Declare Function NetRemoteTOD Lib "Netapi32.dll" _
(yServer As Any, pBuffer As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Declare Function NetApiBufferFree Lib "netapi32" _
(ByVal lpBuffer As Long) As Long
'A potem właściwa funkcja
Sub UstawDateWgSerwera()
Dim serwer() As Byte, ret As Long, ptrBuf As Long
Dim wynik(12) As Long
serwer = "\\serwer" & vbNullChar
ret = NetRemoteTOD(serwer(0), ptrBuf) 'ptrBuf to wskaźnik do bufora z wynikiem
'Za pomocą CopyMemory przepisujemy dane z bufora do tablicy wynik()
CopyMemory wynik(0), ByVal ptrBuf, 12 * 4 'Bufor zawiera 12 elementow typu Long
Call NetApiBufferFree(ptrBuf) 'Usuwamy bufor z pamięci
'Tablica wynik() zawiera teraz odczytane elementy daty z serwera,
'ustawiamy na tej podstawie czas na stacji roboczej
Date = DateSerial(wynik(10), wynik(9), wynik(8)) 'rok ,mies, dzien
Time = TimeSerial(wynik(2), wynik(3) - wynik(6), wynik(4)) 'godz, min - strefa, sek
'(Uwaga: Wynik zawiera czas uniwersalny - musimy uwzględnić strefę)
'A oto znaczenie wszystkich 12 elementow wyniku:
'wynik(0) -> elapsedt (ile sekund uplynelo od 01-01-1970)
'wynik(1) -> msecs (ile milisekund uplynelo od startu systemu)
'wynik(2) -> hours
'wynik(3) -> mins
'wynik(4) -> secs
'wynik(4) -> hunds (setne sekundy)
'wynik(6) -> timezone (przesunięcie czasu względem Greenwich w minutach)
'wynik(6) -> tinterval (okres zegara systemowego w dziesięciotysiecznych sekundy)
'wynik(8) -> day
'wynik(9) -> month
'wynik(10)-> year
'wynik(10)-> weekday
End Sub