%REM
Получение параметра статистики сервера используя вызовы Notes API.
Некоторые параметры из Notes-клиента недоступны,
для их получения нужно вызывать агент на сервере.
Недокументированная API функция Cmovmem используется в этом примере
под псевдонимом CopyBufferToString - она копирует содержимое буфера
и возвращает данные в виде строки в LotusScript.
Julian Robichaux -- http://www.nsftools.com
%END REM
Option Public
Option Declare
Declare Function OSLockObject Lib "nnotes.dll" (ByVal objectHandle As Long) As Long
Declare Function OSUnlockObject Lib "nnotes.dll" (ByVal objectHandle As Long) As Integer
Declare Function OSMemFree Lib "nnotes" (ByVal handle As Long) As Integer
'Недокументировання функция Notes API копирования буфера памяти в строку
Declare Sub CopyBufferToString Lib "nnotes.dll" Alias "Cmovmem" (ByVal lpSrc As Long, ByVal lpDest As String, ByVal lSize As Long)
'Если нужно скопировать не строковые данные, используйте параметр lpDest As Any
Declare Sub CopyBuffer Lib "nnotes.dll" Alias "Cmovmem" (ByVal lpSrc As Long, lpDest As Any, ByVal lSize As Long)
'Функция статистики с возможностью выбора определённого сервера
Declare Private Function NSFGetServerStats Lib "nnotes" Alias "NSFGetServerStats" (ByVal ServerName As LMBCS String, ByVal Facility As LMBCS String, ByVal StatName As LMBCS String, hRetTable As Long, nRetSize As Long) As Integer
'Функция статистики с форматированием вывода
Declare Function StatQueryTime Lib "nnotes" (ByVal facility As String, ByVal statName As Any, _
ByVal headerString As String, ByVal namePrefix As String, ByVal valuePrefix As String, ByVal lineSuffix As String, _
hRetTable As Long, nRetSize As Long) As Integer
%REM
Function GetStatParam
Возвращает параметр статистики с указанного сервера с помощью NSFGetServerStats
На клиенте работает со всеми параметрами статистики, в отличие от GetStatParamFull, возвращая даты в EN-формате
%END REM
Function GetStatParam(sServerName As String, sFacility As String, sStat As String) As String
Dim nError As Integer
Dim hRetTable As Long
Dim nRetSize As Long
nError = NSFGetServerStats(sServerName, sFacility, sStat, hRetTable, nRetSize)
If nError = 0 Then
GetStatParam = GetBufferAsString(hRetTable, nRetSize, 0, True)
If Len(GetStatParam) <> 0 Then
GetStatParam = StrRight(GetStatParam, Chr(9))
GetStatParam = Replace(Replace(GetStatParam, Chr(10), ""), Chr(13), "")
Else
'NOTES_ERR_INVALID_NAME
Error 4375, "Параметр статистики '" + sFacility + "." + sStat + "' отсутствует либо недоступен"
End If
Else
Error nError, "Ошибка вызова API-функции NSFGetServerStats"
End If
End Function
%REM
Function GetStatParamFull
Возвращает параметр статистики с текущего сервера с помощью StatQueryTime;
даты возвращаются в расширенном формате: EN-формат [формат локали]
На клиенте не работает с некоторыми параметрами; для получения нужно использовать GetStatParamFull либо запускать агент на сервере.
%END REM
Function GetStatParamFull(sFacility As String, sStat As String) As String
Dim nError As Integer
Dim hRetTable As Long
Dim nRetSize As Long
nError = StatQueryTime(sFacility, sStat, "", "", Chr(9), "", hRetTable, nRetSize)
If nError = 0 Then
GetStatParamFull = GetBufferAsString(hRetTable, nRetSize, 0, True)
If Len(GetStatParamFull) <> 0 Then
GetStatParamFull = StrRight(GetStatParamFull, Chr(9))
Else
'NOTES_ERR_INVALID_NAME
Error 4375, "Параметр статистики '" + sFacility + "." + sStat + "' отсутствует либо недоступен"
End If
Else
Error nError, "Ошибка вызова API-функции StatQueryTime"
End If
End Function
%REM
Function GetStatDate
Description: возвращает дату-время из параметра статистики в формате текущей локали сервера
%END REM
Public Function GetStatDate(sFacility As String, sStat As String) As Variant
Dim s As String
s = GetStatParamFull(sFacility, sStat)
s = StrLeft(StrRight(s, "["), "]")
If IsDate(s) Then
GetStatDate = CDat(s)
Else
'NOTES_ERR_INVALID_DATE
Error 4045, "Параметр статистики '" + sFacility + "." + sStat + "' содержит значение '" + s + "', не являющееся датой"
End If
End Function
%REM
Копирование информации из буфера в строку
используя недокументированную функцию Cmovmem API (вместо CopyMemory+ из kernel32).
Параметры:
* buffer - адрес буфера
* bufferLen - количество байт для копирования
* offset - точка отсчета начала копирования
* bFreeMem - индикатор? - очищать очищать буфер
или оставить для дальнейшего использования
Julian Robichaux -- http://www.nsftools.com
%END REM
Function GetBufferAsString(buffer As Long, bufferLen As Long, offset As Long, bFreeMem As Boolean) As String
Dim pointer As Long
Dim bufferText As String
bufferText = Space(bufferLen)
pointer = OSLockObject(buffer)
Call CopyBufferToString(pointer + offset, bufferText, bufferLen)
Call OSUnlockObject(buffer)
'Предупреждение: если после вызова OSMemFree вы попробуете заблокировать или
'получить доступ к буферу, это приведет к сбою Notes/Domino
If bFreeMem Then
Call OSMemFree(buffer)
End If
GetBufferAsString = bufferText
End Function