Net Time или функция для получения времени с сервера в сети на основе API NetRemoteTOD

Процедура позволяет получить дату-время с любого компьютера сети. без всяких dcom и прочего

Net Time или функция для получения времени с сервера в сети на основе API NetRemoteTOD

PARAMETERS m.cServerName
*Имя сервера обязательно с символов , например server

PRIVATE m.lcServerName, m.lnBufferPointer, m.cSetDate, m.nHour, m.nMin, m.nSec, m.nmDiv, m.nDay, m.nMon, m.nYear, m.nRetValue
m.cSetDate=SET("DATE")
SET DATE GERMAN
m.nRetValue={..::}
LOCAL ARRAY Arrdlls[1,3]
=ADLLS(Arrdlls)
IF ASCAN(Arrdlls,"NetRemoteTOD")=0
DECLARE INTEGER NetRemoteTOD IN NETAPI32 STRING ServerName,INTEGER @BufferPointer
ENDIF
IF ASCAN(Arrdlls,"NetApiBufferFree")=0
DECLARE INTEGER NetApiBufferFree IN NETAPI32 INTEGER Pointer
ENDIF
IF ASCAN(Arrdlls,"RtlMoveMemory")=0
DECLARE RtlMoveMemory IN Kernel32 String@ dest, Integer src, Integer nsize
ENDIF
IF ASCAN(Arrdlls,"lstrlenW")=0
DECLARE Integer lstrlenW IN Kernel32 Integer src
ENDIF

m.cServerName=ALLTRIM(m.cServerName)
m.lcServerName = StrConv(StrConv(m.cServerName + Chr(0), 1), 5)
m.lnBufferPointer = 0
IF NetRemoteTOD(m.lcServerName,@m.lnBufferPointer)=0 && Все хорошо!
m.nHour = GetMemoryDWORD(lnBufferPointer+8) &&часы
m.nMin = GetMemoryDWORD(lnBufferPointer+12) &&минуты
m.nSec = GetMemoryDWORD(lnBufferPointer+16) &&секунды
m.nmDiv = GetMemoryDWORD(lnBufferPointer+24) &&смещение
m.nDay = GetMemoryDWORD(lnBufferPointer+32) &&день
m.nMon = GetMemoryDWORD(lnBufferPointer+36) &&месяц
m.nYear = GetMemoryDWORD(lnBufferPointer+40) &&год
m.nRetValue=CTOT(PADL(ALLTRIM(STR(m.nDay)),2,"0")+"."+;
PADL(ALLTRIM(STR(m.nMon)),2,"0")+"."+;
PADL(ALLTRIM(STR(m.nYear)),4,"0")+" "+;
PADL(ALLTRIM(STR(m.nHour)),2,"0")+":"+;
PADL(ALLTRIM(STR(m.nMin)),2,"0")+":"+;
PADL(ALLTRIM(STR(m.nsec)),2,"0"))-(60*m.nmDiv)
ENDIF
SET DATE &cSetDate
NetApiBufferFree(m.lnBufferPointer)
RETURN m.nRetValue

FUNCTION GetMemoryLPString
LParameter m.nPointer, m.nPlatform
Local m.cResult, m.nLPStr, m.nslen

m.nLPStr = GetMemoryDWORD(m.nPointer)

m.nslen = lstrlenW(m.nLPStr) * 2
m.cResult = Replicate(chr(0), m.nslen)
RtlMoveMemory(@m.cResult, m.nLPStr, m.nslen)
m.cResult = StrConv(StrConv(m.cResult, 6), 2)

RETURN m.cResult
ENDFUNC
*--
* Return Number from a pointer to DWORD
*--
FUNCTION GetMemoryDWORD
LParameter m.nPointer
Local m.cstrDWORD
m.cstrDWORD = Replicate(chr(0), 4)
RtlMoveMemory(@m.cstrDWORD, m.nPointer, 4)
RETURN str2long(m.cstrDWORD)
ENDFUNC

*--
* Convert a Number intto a binary Long Integer
*--
FUNCTION long2str
LParameter m.nLong

m.nLong = Int(m.nLong)
RETURN (chr(bitand(m.nLong,255)) + ;
chr(bitand(bitrshift(m.nLong, 8), 255)) + ;
chr(bitand(bitrshift(m.nLong, 16), 255)) + ;
chr(bitand(bitrshift(m.nLong, 24), 255)))
ENDFUNC
*--
* Convert a binary Long Integer into a Number
*--
FUNCTION str2long
LParameter m.cpLong
Return (Bitlshift(Asc(Substr(m.cpLong, 4, 1)), 24) + ;
Bitlshift(Asc(Substr(m.cpLong, 3, 1)), 16) + ;
Bitlshift(Asc(Substr(m.cpLong, 2, 1)), 8) + ;
Asc(Substr(m.cpLong, 1, 1)))
ENDFUNC

Автор: Михаил (Bomber)

Автор публикации

не в сети 11 месяцев

Михаил (Bomber)

0
Комментарии: 0Публикации: 2Регистрация: 26-08-2020
0
Оставить комментарий
Авторизация
*
*
Генерация пароля